在我的网页上,页面加载但页面的子标签在20秒内无法点击(有时超过此时间)。页面内容是 -
<nav id="subTabHeaders">
<div class="selected" data-name="ab">AB</div>
<div class="" data-name="cd">CD</div>
<div class="" data-name="ef">EF</div>
<div class="" data-name="gh">GH</div>
</nav>
我要点击子标签,因此我尝试以下方式 - 睡觉和放松然后是element.click 但睡眠并不是理想的处理方式,因为有时可能会发生子标签元素在睡眠时间之前或之后可以点击。
使用睡眠,我做了以下 -
element = WAIT.until { driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")}
sleep 20
element.click
如果在超过睡眠时间后可点击元素&amp;我们在睡眠时间到期后立即点击元素,(我的意思是(使用上面的代码)假设元素在30秒后变为可点击但我们在20秒后立即点击元素),实际点击动作不会发生&amp;也点击不会返回任何错误。
是否有Ruby方法来检查元素是否可点击?这样我们就可以知道何时点击。
答案 0 :(得分:2)
来自ruby bindings page :(见驱动程序示例)
# wait for a specific element to show up
wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
wait.until { driver.find_element(:id => "foo") }
通常你可以这样做:
wait = Selenium::WebDriver::Wait.new(:timeout => 40)
wait.until do
element = driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")
element.click
end
或者更简洁
wait = Selenium::WebDriver::Wait.new(:timeout => 40)
wait.until { driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]").click }
但是,由于您说点击不会引发错误,听起来好像点击实际上正常工作,只是您的页面还没有准备好显示该标签。我猜这里有一些异步javascript。
所以你可以尝试的是在等待块内,检查点击是否导致了所需的更改。我猜,但你可以试试像:
wait = Selenium::WebDriver::Wait.new(:timeout => 40)
wait.until do
driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]").click
driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3][@class='selected']")
end
重要的是#until将等待并重复,直到块获得真实结果或超时超时。
答案 1 :(得分:1)
怎么样
WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(subTabHeaders)));
答案 2 :(得分:0)
希望它会对你有所帮助:
begin
element = WAIT.until { driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")}
sleep 20
element.click
rescue Selenium::WebDriver::Error::StaleElementReferenceError
p "Indicates that a reference to an element is now “stale” - the element no longer appears in the DOM of the page."
end
或强>
你可以尝试这个:begin
wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
wait.until { driver.title.include? "page title" }
driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")}.click
rescue Selenium::WebDriver::Error::StaleElementReferenceError
p "element is not present"
end
答案 3 :(得分:0)
这是我使用的 - 测试链接是否可点击,否则转到另一个URL:
if (logOutLink.Exists() && ExpectedConditions.ElementToBeClickable(logOutLink).Equals(true))
{
logOutLink.Click();
}
else
{
Browser.Goto("/");
}