Browserstack测试IE,Selenium没有找到加载的元素

时间:2016-03-04 18:46:02

标签: ruby internet-explorer selenium-webdriver browserstack

好的 - 问题似乎已得到解决 - 请参阅下面的工作解决方案。

问题=> 小心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

而且 - 它有效!

1 个答案:

答案 0 :(得分:1)

根据您的测试,我相信即使没有使用find_elements(:css => "div[id^="google_ads"]")命令找到元素,您的脚本也会继续执行。这是因为显式等待仅等待命令的成功执行,并且对于查找元素命令的空响应被认为是成功的。

我建议您在测试中使用隐式等待替换显式等待。这将帮助您等到所有元素都加载到DOM中,然后继续执行测试。您可以在测试中使用以下命令添加隐式等待:

driver.manage.timeouts.implicit_wait = 5 # seconds

或者,您可以通过JavaScript或jQuery命令验证网页上是否已加载所有广告。完成后,您可以继续执行测试。