【问题标题】:How to use watir-webdriver to wait for page load如何使用 watir-webdriver 等待页面加载
【发布时间】:2010-08-17 15:47:04
【问题描述】:

使用watir-webdriver,点击链接后如何等待页面加载?

目前我正在使用:

sleep n

但这并不理想,因为页面响应变化很大。

有没有办法测试页面是否准备好或者页面中是否有某个元素?我知道在普通的 Watir gem 中有 Watir::Waiter.wait_until 或类似的东西,但我在 webdriver 版本中看不到这个。

【问题讨论】:

  • 您是否想让某些东西等到页面完全加载后?我认为这是标准行为......
  • 其实你是对的。但是我不得不睡觉的原因是因为我有一些 ajax 更新页面内容。我想等到响应成功。

标签: webdriver watir firewatir safariwatir


【解决方案1】:

我不知道它们是否是最好的方法,但这就是我等待更新 div 清除的方式:

while browser.div(:id=>"updating_div").visible? do sleep 1 end

这就是我等待显示的处理方式:

until browser.div(:id=>"some_div").exists? do sleep 1 end

【讨论】:

  • cool 这在 Firefox 中完美运行,在 chrome 中不是很好。我已经走了: sleep 1 until browser.div(:foo => 'bar').exists?
  • 不推荐使用上述方法,因为它可能永远不会返回并锁定您的脚本(javascript 错误、代码更改等)。 Watir::Waiter.wait_until(15) { browser.div(:id => "updating_div).visible? }
【解决方案2】:

今天的版本增加了一个可选的 require ,它引入了一些等待元素的助手。这些(目前)在 Watir 1.6 中不可用,因此请注意是否同时使用这两个库。

查看 Watir-webdriver Wiki 中的“AJAX and waiting for elements”了解更多信息。

【讨论】:

    【解决方案3】:

    最好的总结在“Waiting”。

    简而言之就是这样:

    require 'watir-webdriver'
    b = Watir::Browser.start 'bit.ly/watir-webdriver-demo'
    b.select_list(:id => 'entry_1').wait_until_present
    b.text_field(:id => 'entry_0').when_present.set 'your name'
    b.button(:value => 'Submit').click
    b.button(:value => 'Submit').wait_while_present
    Watir::Wait.until { b.text.include? 'Thank you' }
    

    【讨论】:

      【解决方案4】:

      这就是我在项目中等待 AJAX 的方式:

      ajax_loader = $b.element(:xpath  => "//*[@id='spinner-modal-transparent' and @aria-hidden='true']/div/div/div/div/img[@alt='Ajax transparent loader']")
      
      if ajax_loader.exists?
        ajax_loader.wait_while_present(timeout=350)
      else
        puts "The AJAX loader was not present."
      end
      

      【讨论】:

        【解决方案5】:

        browser.wait_until 可以使用。

        这更有帮助,因为您可以在参数 (()) 中定义要等待的内容,如:

        browser.wait_until(browser.text.include("some text"))
        

        【讨论】:

          【解决方案6】:

          您可以使用wait_untilwaituntilExists 方法。

          【讨论】:

            【解决方案7】:

            我遇到了同样的问题,我尝试通过结合 wait_until_present

            来解决它
            until browser.div(:id=>"some_div").exists? do sleep 1 end
            

            @marc 提供的技巧:

            some_div = browser.div(:id => 'some_div')
            
            begin 
            
              Watir::Wait.until
                some_div.visible?
              end
            
            rescue Watir::Wait::TimeoutError
            
              until some_div.visible?
                sleep 1
              end
            end
            

            请注意,您有责任确保

            div(:id => "some_div")
            

            确实存在。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-04
              • 2018-03-07
              • 2012-05-11
              • 1970-01-01
              • 2013-09-09
              • 2012-07-07
              • 2019-01-31
              • 1970-01-01
              相关资源
              最近更新 更多