我是从以下环境过渡的:
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定位有问题。
答案 0 :(得分:1)
问题是Watir被告知找到一个表元素,但是:css
定位器正在寻找一个tbody元素。当前版本的Watir验证找到的元素是否具有匹配的标记名称。虽然我认为Watir一直在这样做,但是最近在Locator类的重新分解中可能会遇到一些边缘情况。
理想情况下,您可以将table
访问者切换为tbody
访问者。但是,没有实施。相反,您需要使用通用的element
:
element(:html_table, :tbody, css: 'tbody')
迭代表的行将需要显式调用#trs
:
html_table_element.trs.each do |row|
return row[0].text if row[0].text == element
end