如何执行复杂的 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 支持的方法。有两种通用方法:

  1. 使用 Watir 定位元素,然后使用 execute_script
  2. 单击元素
  3. 使用 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.

完成定位和点击时,检查几乎是即时的