watir webdriver-执行_脚本引发javascript错误

watir webdriver-执行_脚本引发javascript错误,javascript,ruby,watir-webdriver,Javascript,Ruby,Watir Webdriver,下面的javascript代码获取以“opt1”开头的所有div元素的id和内部文本。我之所以使用javascript,是因为这个div是不可见的,webdriver不支持访问不可见的元素 下面的代码在irb上执行时工作正常,但在运行整个脚本时出现“JavaScript错误”而失败。我还在IE控制台上执行了javascript代码,以确保javascript正确无误 mn = $browser.execute_script <<-JS var eles = window.

下面的javascript代码获取以“opt1”开头的所有div元素的id和内部文本。我之所以使用javascript,是因为这个div是不可见的,webdriver不支持访问不可见的元素

下面的代码在irb上执行时工作正常,但在运行整个脚本时出现“JavaScript错误”而失败。我还在IE控制台上执行了javascript代码,以确保javascript正确无误

   mn = $browser.execute_script <<-JS
   var eles = window.frames[1].document.getElementsByTagName('div');
   var dom = [];
   for ( var i = 0; i < eles.length; i++) {
     if (eles[i].id.indexOf("opt1_") === 0) {
       dom.push(eles[i].id + "--" + eles[i].innerText);
     }
   }
   return dom;
   JS

mn=$browser.execute\u script问题可能出在Selenium处理帧的方式上。在尝试对帧执行任何操作时,似乎会出现Javascript错误-即错误发生的原因是:

window.frames[1].document
解决方案-在框架上下文中执行Javascript

一种解决方案是在框架的上下文中运行Javascript

假设主页面使用iframes(尽管可以对框架进行类似操作):

解决方案-仅使用Watir

虽然Watir无法对不可见元素执行操作,但您仍然可以检查它们。唯一困难的是获取文本,因为元素#text只返回可见文本。解决方法是使用
元素#属性_值

通过执行以下操作,可以获得与Javascript方法相同的结果:

frame = b.iframe(:index => 1) # Use .frame if the page is using frames instead
mn = b.divs(:id => /^opt1_/).map do |div|
  "#{div.id}--#{div.attribute_value('innerText')}"
end
p mn
#=> ["opt1_visible--visible content", "opt1_hidden--hidden content"]
请注意,
.attribute\u value('innerText')
在IE中工作。如果使用Firefox,则需要执行
.attribute\u value('textContent')
。我相信Chrome支持这两个属性

<html>
  <body>
    <div>irrelevant content</div>
    <div id="opt1_visible">visible content</div>
    <div id="opt1_hidden" style="display:none;">hidden content</div>
  </body>
</html>
frame = browser.iframe(:index => 1) # Use .frame if the page is using frames instead
mn = frame.execute_script <<-JS
   var eles = document.getElementsByTagName('div');
   var dom = [];
   for ( var i = 0; i < eles.length; i++) {
     if (eles[i].id.indexOf("opt1_") === 0) {
       dom.push(eles[i].id + "--" + eles[i].innerText);
     }
   }
   return dom;
   JS
p mn
#=> ["opt1_visible--visible content", "opt1_hidden--hidden content"]
frame = b.iframe(:index => 1) # Use .frame if the page is using frames instead
mn = b.divs(:id => /^opt1_/).map do |div|
  "#{div.id}--#{div.attribute_value('innerText')}"
end
p mn
#=> ["opt1_visible--visible content", "opt1_hidden--hidden content"]