好的 - 问题似乎已得到解决 - 请参阅下面的工作解决方案。
问题=> 小心Selenium的显式超时与隐式超时。 我正在使用Browserstack远程测试IE,通过Selenium的Ruby Bindings,通过RSpec运行测试。
我要查询的元素是google ad divs,我想确保我们在所有平台上投放广告。加载是异步的,所以我确保等待页面加载。
当我从ruby shell(irb)手动驱动selenium时,我总能找到IE中的元素,版本9,10,11。 我在Browserstack的“实时”浏览器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
解决方案=&gt;
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
而且 - 它有效!
答案 0 :(得分:1)
根据您的测试,我相信即使没有使用find_elements(:css => "div[id^="google_ads"]")
命令找到元素,您的脚本也会继续执行。这是因为显式等待仅等待命令的成功执行,并且对于查找元素命令的空响应被认为是成功的。
我建议您在测试中使用隐式等待替换显式等待。这将帮助您等到所有元素都加载到DOM中,然后继续执行测试。您可以在测试中使用以下命令添加隐式等待:
driver.manage.timeouts.implicit_wait = 5 # seconds
或者,您可以通过JavaScript或jQuery命令验证网页上是否已加载所有广告。完成后,您可以继续执行测试。