javascript - 如何执行复杂的Javascript代码?

标签 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 没有问题。问题在于执行。 您能帮我找出问题所在吗?

最佳答案

问题是 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 完成时,检查几乎是瞬时的。

关于javascript - 如何执行复杂的Javascript代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35516746/

相关文章:

ruby-on-rails - Heroku、Rails 和 ActiveUUID——Heroku 使用旧的迁移文件?

ruby - 改进此递归函数以在 Ruby 中进行哈希遍历

Selenium:检查是否存在元素

javascript - JQuery $.post() 不适用于 document.onbeforeunload 事件吗?

javascript - node.js 及其服务器的安全性如何?

javascript - 扩展 Javascript 语法以添加输入

ruby-on-rails - 更新哈希中的哈希的最佳方法是什么?

python - 更改 Firefox 首选项后,Selenium Firefox Webdriver 不会加载空白页面

java - Selenium fluenceWait 导致 StaleElementReferenceException

javascript - jquery 选择器类型文本或密码