Selenium WebDriver executeScript存在问题(在Ruby中使用watir WebDriver)

Selenium WebDriver executeScript存在问题(在Ruby中使用watir WebDriver),ruby,selenium-webdriver,watir-webdriver,legacy-code,page-object-gem,Ruby,Selenium Webdriver,Watir Webdriver,Legacy Code,Page Object Gem,我在使用Watir WebDriver的浏览器执行特定javascript代码段时遇到问题。执行脚本命令: 下面是讨论中的Javascript: var bodyFrame = document.getElementsByName("BodyFrame")[0]; var bodyFrameDoc = bodyFrame.contentDocument || bodyFrame.contentWindow.document; var mainFrame = bodyFrameDoc.

我在使用Watir WebDriver的浏览器执行特定javascript代码段时遇到问题。执行脚本命令:

下面是讨论中的Javascript:

  var bodyFrame = document.getElementsByName("BodyFrame")[0];
  var bodyFrameDoc = bodyFrame.contentDocument || bodyFrame.contentWindow.document;
  var mainFrame = bodyFrameDoc.getElementById("MainFrame");
  var mainFrameDoc = mainFrame.contentDocument || mainFrame.contentWindow.document;
  var row = mainFrameDoc.getElementById("DETAIL_1");
  var rowNodes = row.childNodes;
  var index;
  for (index = 0; index < rowNodes.length; index++) {

        if (rowNodes[index].firstChild.id === 'ID1') {
            rowNodes[index].firstChild.value = 'ACCRUL';
        }


        if (rowNodes[index].firstChild.id === 'ID2') {
            rowNodes[index].firstChild.value = 'OP';
        }


        if (rowNodes[index].firstChild.id === 'ID3') {
            rowNodes[index].firstChild.value = 'Z';
        }


        if (rowNodes[index].firstChild.id === 'ID4') {
            rowNodes[index].firstChild.value = 'FIRST';
        }


        if (rowNodes[index].firstChild.id === 'ID5') {
            rowNodes[index].firstChild.value = 'AUT';
        }


        if (rowNodes[index].firstChild.id === 'ID6') {
            rowNodes[index].firstChild.value = 'AU1000';
        }


        if (rowNodes[index].firstChild.id === 'ID7') {
            rowNodes[index].firstChild.value = 'm tax m entity m jc';
        }


        if (rowNodes[index].firstChild.id === 'ID8') {
            rowNodes[index].firstChild.value = 'MR5001100';
        }


        if (rowNodes[index].firstChild.id === 'ID9') {
            rowNodes[index].firstChild.value = 'T';
        }


        if (rowNodes[index].firstChild.id === 'ID10') {
            rowNodes[index].firstChild.value = '453.36';
        }

  }
奇怪的是,如果我用

  return document.getElementsByName("BodyFrame")[0];
然后,我在Net::HTTP库中得到了一个错误,Selenium在堆栈的某个位置使用该库来回向浏览器发送命令。(更具体地说:ERRNO::errconneeded)

帮忙

编辑:下面是我用来执行代码(并生成少量Javascript)的直接脚本:

因此,示例调用将是(来自cucumber测试)

除此之外,还有一个不幸的问题,即访问此页面需要几个“attach_window”调用(由于该页面位于各种模式对话框中)。这个问题可能在很大程度上与这种互动有关。这是我能想到的唯一会引起问题的事情


这个问题的重点是希望能有第二双眼睛来排除任何明显的错误。我计划采用另一种解决方法。

如果您只测试Internet Explorer,为什么不使用“watir classic”gem?使用watir classic应该允许您直接执行该代码,而无需使用
execute_script
方法。部分原因是我们使用watir webdriver顶部的页面对象gem,以实现美观的页面类交互,这对于简单的“快乐路径”的大多数自动化需求来说都很好。不幸的是,有几个实例需要更多的数据来完全测试一个基本路径,这就是我试图寻找Javascript的地方。也许我可以看看“watir classic”gem。您是如何运行
execute\u script
方法的?我只试了一行,并没有得到任何异常。我已经添加了更多关于如何调用上述方法的信息。顺便说一句,您的页面不需要符合HTML标准并且是有效的HTML吗?页面中重复的ID值是无效的HTML。如果他们不关心可测试性(他们显然不关心,你的时间对他们来说似乎没有什么价值),那么他们关心标准吗?
  return document.getElementsByName("BodyFrame")[0];
    def quick_fill(data = {})
      reference_element.focus;
      quick_filler = ->(element_id, value) {
        "if (rowNodes[index].firstChild.id === '#{element_id}') {
           rowNodes[index].firstChild.value = '#{value}';
         }"
      }
      row_id = row.attribute(:id)
      element_ids = Hash[data.keys.map { |key| [key, send("#{key}_element").attribute(:id)] }]
      javascript = <<-JAVASCRIPT
      var bodyFrame = document.getElementsByName("BodyFrame")[0];
      var bodyFrameDoc = bodyFrame.contentDocument || bodyFrame.contentWindow.document;
      var mainFrame = bodyFrameDoc.getElementById("MainFrame");
      var mainFrameDoc = mainFrame.contentDocument || mainFrame.contentWindow.document;
      var row = mainFrameDoc.getElementById("DETAIL_1");
      var rowNodes = row.childNodes;
      var index;
      for (index = 0; index < rowNodes.length; index += 1) {
        #{element_ids.map { |method, element_id| quick_filler.call(element_id, data[method]) }.join("\n") }
      }
      JAVASCRIPT
      puts javascript
      sleep(0.500)
      browser.execute_script(javascript)
    end
class MyPage
  include PageObject

  table(:some_table, ...)

  def add_line_item(data = {})
    GridRow.new(some_table_element.last_row, browser).quick_fill(data)
  end

  class GridRow
    include PageObject

    #page object accessors
    text_field(:my_field) { row.text_field_element(id: 'ID1') }
    #etc

    def quick_fill(data = {})
      #see above
    end

    def initialize(row, browser, visit = false)
      @row = row
      super(browser, visit) 
    end
  end
end
on_page(MyPage) do |page|
  page.add_line_item(:my_detail => 'myValue')
end