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没有问题。问题在于执行。 你能帮我解决一下是什么问题吗?
答案 0 :(得分:0)
问题是IE不支持XPath - 即不支持document.evaluate
(参见MDN page)。
您需要更改脚本,以便它使用IE支持的方法。有两种通用方法:
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
完成定位和点击时,检查几乎是即时的。