如何执行复杂的Javascript代码?

时间:2016-02-19 23:09:32

标签: javascript ruby selenium watir

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没有问题。问题在于执行。 你能帮我解决一下是什么问题吗?

1 个答案:

答案 0 :(得分:0)

问题是IE不支持XPath - 即不支持document.evaluate(参见MDN page)。

您需要更改脚本,以便它使用IE支持的方法。有两种通用方法:

  1. 使用Watir找到元素,然后使用execute_script
  2. 单击元素
  3. 使用execute_script找到并点击元素。
  4. 给定一个包含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完成定位和点击时,检查几乎是即时的。