Ok --该问题似乎已解决 - 请参阅下面的工作解决方案。
问题=>小心Selenium的显式超时与隐式超时。我正在使用Browserstack通过Selenium的Ruby Bindings远程测试IE,通过RSpec运行测试。
我正在查询的元素是谷歌广告div,我想确保我们在所有平台上投放广告。加载是异步的,所以我确保等待页面加载。
当我从红宝石外壳(irb)手动驱动硒时,我总是能够在IE版本9,10,11中找到元素。当我在浏览器堆栈的"实时"浏览器内 IE 仿真中手动导航到该站点时也是如此。
但是 - 当我通过RSpec以编程方式运行与在shell中相同的命令时 - 我的测试大约50%的时间失败。IE 11 受到的打击最大,大多数测试都失败了。IE 10 往往表现得更好一些。
Firefox + Chrome的相同测试正在通过。
依赖:
ruby '2.3.0'
gem 'selenium-webdriver'
gem 'rspec'
gem 'curb', '~> 0.9.1'
有什么想法吗?
describe "Testing example.com in production with ie." do
it "loads ads on home page" do
caps = Selenium::WebDriver::Remote::Capabilities.internet_explorer
caps["browser_version"] = "11.0"
caps["os"] = "WINDOWS"
caps["os_version"] = "8"
caps["resolution"] = "1024x768"
caps["browserstack.debug"] = "true"
driver = Selenium::WebDriver.for(:remote,
:url => "http://<my_username>:<my_pw>@hub.browserstack.com/wd/hub",
:desired_capabilities => caps)
driver.navigate.to "http://www.example.com"
wait = Selenium::WebDriver::Wait.new(:timeout => 5) # seconds
verify = []
begin #
wait.until do
verify = driver.find_elements(:css => "div[id^="google_ads"]")
end
ensure
driver.quit
end
expected_ad_count = 5
expect( verify.count ).to eq expected_ad_count
end
end
解决方案 =>IE 的显式等待块失败。解决方案是在初始化driver
后配置隐式等待,如下所示:
driver = Selenium::WebDriver.for(:remote,
:url => "http://<my_username>:<my_pw>@hub.browserstack.com/wd/hub",
:desired_capabilities => caps)
driver.manage.timeouts.implicit_wait = 5
driver.navigate.to "http://www.example.com"
begin #
verify = driver.find_elements(:css => "div[id^="google_ads"]")
ensure
driver.quit
end
expected_ad_count = 5
expect( verify.count ).to eq expected_ad_count
而且 - 它有效!
根据您的测试,我相信即使您没有使用 find_elements(:css => "div[id^="google_ads"]")
命令找到元素,您的脚本也会继续执行。这是因为显式等待仅等待命令的成功执行,而查找元素命令的空响应被视为成功。
我建议您在测试中用隐式等待替换显式等待。这将帮助您等到所有元素都加载到 DOM 中,然后继续执行测试。可以在测试中使用以下命令添加隐式等待:
driver.manage.timeouts.implicit_wait = 5 # seconds
或者,您可以通过JavaScript或jQuery命令验证所有广告是否已加载到网页上。完成后,可以继续执行测试。