如何执行复杂的 Javascript 代码?
How to execute complex Javascript code?
access = 'Product Name'
path = "//span[contains(text(), '#{access}')]/parent::*[1]/preceding-sibling::input[1]"
jscript = <<EOF
function setCheckboxes(path){
var cbx = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
cbx.click()};
setCheckboxes("#{path}");
EOF
@browser.execute_script jscript
当我运行这个脚本时,我得到一个错误:
Selenium::WebDriver::Error::JavascriptError: JavaScript error
javascript 或 xpath 没有问题。问题在于执行。
你能帮我找出问题所在吗?
问题是 IE 不支持 XPath - 即 document.evaluate
不受支持(参见 MDN page)。
您需要更改脚本,使其使用 IE 支持的方法。有两种通用方法:
- 使用 Watir 定位元素,然后使用
execute_script
或 单击元素
- 使用
execute_script
定位并单击元素。
给定一个包含 400 个复选框的 HTML 页面,例如:
<input type="checkbox">
<label>
<span>Product Name</span>
</label>
我们可以对各种方法进行基准测试:
def browser_setup
browser = Watir::Browser.new :ie
browser.goto 'file:///C:/test/page.htm'
browser
end
Benchmark.bm do |x|
x.report("Locate and click via standard methods:") do
browser = browser_setup
browser.checkboxes.each(&:click)
end
x.report("Locate via standard methods and click via script:") do
browser = browser_setup
browser.checkboxes.each do |checkbox|
browser.execute_script('arguments[0].click();', checkbox)
end
end
x.report("Locate and click via script:") do
access = 'Product Name'
check_all = %Q{
all_spans = document.getElementsByTagName("span")
for (var i = 0, max = all_spans.length; i < max; i++){
if (all_spans[i].innerText.indexOf("#{access}") > -1){
var parent = all_spans[i].parentElement;
var preceding_sibling = parent.previousSibling;
while(preceding_sibling && preceding_sibling.nodeType != 1 && preceding_sibling.tagName != "input") {
preceding_sibling = preceding_sibling.previousSibling;
}
preceding_sibling.click();
}
}
}
browser = browser_setup
browser.execute_script(check_all)
end
end
给出结果:
user system total real
Locate and click via standard methods: 0.109000 0.171000 0.280000 (207.682750)
Locate via standard methods and click via script: 0.063000 0.031000 0.094000 ( 58.156400)
Locate and click via script: 0.000000 0.000000 0.000000 ( 2.516400)
从结果中我们可以看出,仅使用标准的 Watir 复选框方法时,这个大页面的执行速度很慢。通过直接单击带有 execute_script
的元素可以显着提高性能。当通过 execute_script
.
完成定位和点击时,检查几乎是即时的
access = 'Product Name'
path = "//span[contains(text(), '#{access}')]/parent::*[1]/preceding-sibling::input[1]"
jscript = <<EOF
function setCheckboxes(path){
var cbx = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
cbx.click()};
setCheckboxes("#{path}");
EOF
@browser.execute_script jscript
当我运行这个脚本时,我得到一个错误:
Selenium::WebDriver::Error::JavascriptError: JavaScript error
javascript 或 xpath 没有问题。问题在于执行。 你能帮我找出问题所在吗?
问题是 IE 不支持 XPath - 即 document.evaluate
不受支持(参见 MDN page)。
您需要更改脚本,使其使用 IE 支持的方法。有两种通用方法:
- 使用 Watir 定位元素,然后使用
execute_script
或 单击元素
- 使用
execute_script
定位并单击元素。
给定一个包含 400 个复选框的 HTML 页面,例如:
<input type="checkbox">
<label>
<span>Product Name</span>
</label>
我们可以对各种方法进行基准测试:
def browser_setup
browser = Watir::Browser.new :ie
browser.goto 'file:///C:/test/page.htm'
browser
end
Benchmark.bm do |x|
x.report("Locate and click via standard methods:") do
browser = browser_setup
browser.checkboxes.each(&:click)
end
x.report("Locate via standard methods and click via script:") do
browser = browser_setup
browser.checkboxes.each do |checkbox|
browser.execute_script('arguments[0].click();', checkbox)
end
end
x.report("Locate and click via script:") do
access = 'Product Name'
check_all = %Q{
all_spans = document.getElementsByTagName("span")
for (var i = 0, max = all_spans.length; i < max; i++){
if (all_spans[i].innerText.indexOf("#{access}") > -1){
var parent = all_spans[i].parentElement;
var preceding_sibling = parent.previousSibling;
while(preceding_sibling && preceding_sibling.nodeType != 1 && preceding_sibling.tagName != "input") {
preceding_sibling = preceding_sibling.previousSibling;
}
preceding_sibling.click();
}
}
}
browser = browser_setup
browser.execute_script(check_all)
end
end
给出结果:
user system total real
Locate and click via standard methods: 0.109000 0.171000 0.280000 (207.682750)
Locate via standard methods and click via script: 0.063000 0.031000 0.094000 ( 58.156400)
Locate and click via script: 0.000000 0.000000 0.000000 ( 2.516400)
从结果中我们可以看出,仅使用标准的 Watir 复选框方法时,这个大页面的执行速度很慢。通过直接单击带有 execute_script
的元素可以显着提高性能。当通过 execute_script
.