我有这样的代码:
until @driver.find_element(:id, "ctl00_cp_lblC").displayed?
puts "invalid page solution"
enter_page
end
我需要做一些方法,直到page会有一些带有一些id的元素,现在它抛出了错误,selenium找不到具有这个id的元素。我做错了什么,以及如何解决它?
也许用watir更容易吗?
答案 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会抛出异常。你想要:
这看起来像是:
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