浏览器堆栈测试IE,Selenium找不到加载的元素



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命令验证所有广告是否已加载到网页上。完成后,可以继续执行测试。

最新更新