重新加载页面,直到它有一些元素使用ruby selenium-webdriver

时间:2013-09-06 14:10:54

标签: ruby selenium watir

我有这样的代码:

until @driver.find_element(:id, "ctl00_cp_lblC").displayed?
  puts "invalid page solution"
  enter_page
end

我需要做一些方法,直到page会有一些带有一些id的元素,现在它抛出了错误,selenium找不到具有这个id的元素。我做错了什么,以及如何解决它?

也许用watir更容易吗?

2 个答案:

答案 0 :(得分:0)

当找不到元素时,Webdriver会抛出错误。 显示?仅显示对象是否隐藏。如您所见,当对象甚至不在html中时,会发生NoSuchElementFound异常。

为java道歉,但你应该明白这一点;

Boolean elementFound = false;

    do {
        getDriver().manage().timeouts().implicitlyWait(500, TimeUnit.MILLISECONDS);
        try {
             elementFound = getDriver().findElement(By.id("ct100_cp_lblC")).isDisplayed();

        }
        catch (NoSuchElementException e){
        }   
        getDriver().navigate().refresh();  

    } while (!elementFound);

    getDriver().manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

你需要额外的代码才能阻止无限循环,但是你应该知道这个想法。

这是Watir& amp; WebDriver API,但我想这是你习惯的任何东西。

答案 1 :(得分:0)

正如前面提到的,如果元素不存在,则find_element会抛出异常。你想要:

  1. 挽救未找到元素的异常并调用您的enter_page方法
  2. 将所有内容包装在wait.until中,以便它无法无限期地运行
  3. 这看起来像是:

    wait = Selenium::WebDriver::Wait.new(:timeout => 5) # seconds
    begin
      element = wait.until do
        begin
          @driver.find_element(:id, "ctl00_cp_lblC")
        rescue
          enter_page
        end
      end
    ensure
      @driver.quit
    end
    

    在Watir,它会更容易。它只是:

    browser.element(:id => "ctl00_cp_lblC").wait_until_present
    

    或者当元素不存在时你需要做东西:

    browser.wait_until(2) do
      present = browser.element(:id => "ctl00_cp_lblC").present?
      enter_page unless present 
      present
    end