【问题标题】:Watir can't find element but it's presentWatir 找不到元素,但它存在
【发布时间】:2018-08-25 19:31:33
【问题描述】:

我正在从以下环境过渡:

chromedriver 2.27
google-chrome 58
selenium-webdriver 3.0.5
watir 6.0.2
page-object 2.0.0

到这个环境:

chromedriver 2.36
google-chrome 63
selenium-webdriver 3.9.0
watir 6.7.3
page-object 2.2.2

我已经准备好我的黄瓜测试并在旧环境中工作,其中一些在新环境中正常工作,但由于某种原因,有一个测试拒绝找到某个元素并给我以下异常(即使元素清楚地存在于页面和 DOM 中):

timed out after 30 seconds, Element not present in 30 seconds (Watir::Wait::TimeoutError)

元素是这样定义的:

table(:some_table, :css => 'table.table.table-condensed.table-striped.sortable tbody')

有没有人遇到过同样的问题,我找了很多,找不到解决这个问题的方法。

示例:

功能文件:

Feature: HTML Tables

  Scenario:  Demo of reproducing the problem

    Given I am logged in to HTML Tables page
    Then within 10 I expect to see Alfreds Futterkiste in the table

步骤:

Given(/I am logged in to HTML Tables page$/) do 
  visit HtmlTables
end

Then(/^within (.+) I expect to see (.+) in the table$/) do |time_limit, element|
  on HtmlTables do |page|
    actual_element = page.search_for_element(element, time_limit)
    expect(actual_element).to match(element), "Expected element to match: #{element}; got: #{actual_element}"
  end
end

页面:

class HtmlTables
  include PageObject

  page_url "https://www.w3schools.com/html/html_tables.asp"

  table(:html_table,                   :css    => 'tbody')

  def search_for_element(element, time_limit)
    Retriable.retriable on: [Watir::Exception::UnknownObjectException],
                      tries: time_limit.to_i/10,
                      base_interval: 10 do
      html_table_element.each do |row|
        return row[0].text if row[0].text == element
      end 
    end
  end
end

它给出了同样的问题 - 我认为它在使用 css 和/或 xpath 定位时存在问题。

【问题讨论】:

  • 您是否可以选择转到最新的 Watir 版本,目前是 6.10.3?我认为 6.8.x 围绕定位元素做了一些修复。
  • @JustinKo 我已经升级到 6.9.0 并且有同样的问题。你认为 6.10.x 会有所作为吗?
  • 我认为它不会解决问题,但鉴于您正在升级版本,最好将所有内容升级到最新版本。您可以尝试创建一个重现该问题的页面吗?
  • @JustinKo 我添加了一个示例(在问题中),并且还升级到了最新版本,不幸的是它没有帮助。

标签: ruby cucumber selenium-chromedriver watir page-object-gem


【解决方案1】:

问题是 Watir 被告知要查找 table 元素,但是 :css 定位器正在查找 tbody 元素。当前版本的 Watir 验证找到的元素是否具有匹配的标签名称。虽然我认为 Watir 一直在这样做,但最近对 Locator 类的重构可能解决了一些边缘情况。

理想情况下,您可以将table 访问器切换为tbody 访问器。但是,没有一个实施。相反,您需要使用通用的element one:

element(:html_table, :tbody, css: 'tbody')

迭代表的行需要显式调用#trs

html_table_element.trs.each do |row|
  return row[0].text if row[0].text == element
end   

【讨论】:

  • 这行得通,只是由于某种原因它没有给出单元格中的文本,而是我得到了这个:#<:cell:0x000000033b5fd0>
  • 那是#search_for_element返回的值?如果表中没有匹配项,我可以看到类似的内容被返回,尽管我得到的是行而不是单元格元素。
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多