4

在我的网页上,页面加载但页面的子选项卡在 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

如果元素在超过睡眠时间后可点击并且我们在睡眠时间到期后立即点击元素,(我的意思是(使用上面的代码)假设元素在 30 秒后变为可点击,但我们在 20 秒后立即点击元素),实际的点击动作不会发生并且 click 也不会返回任何错误。

是否有 Ruby 方法来检查元素是否可点击?这样我们就会知道什么时候点击。

4

4 回答 4

3

ruby​​ 绑定页面:(请参阅驱动程序示例)

# 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将等待并重复,直到块得到一个真实的结果或超时。

于 2013-03-26T19:28:23.820 回答
1

怎么样

WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(subTabHeaders)));
于 2013-03-26T17:59:29.067 回答
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
于 2013-03-26T17:32:56.883 回答
0

这是我使用的 - 测试链接是否可点击,否则转到另一个 URL:

    if (logOutLink.Exists() && ExpectedConditions.ElementToBeClickable(logOutLink).Equals(true))
    {
        logOutLink.Click();
    }
    else
    {
        Browser.Goto("/");
    }
于 2016-03-09T05:15:23.210 回答