如何使用 Selenium WebDriver 和 Ruby 确定该元素是可点击的?

Posted

技术标签:

【中文标题】如何使用 Selenium WebDriver 和 Ruby 确定该元素是可点击的?【英文标题】:How to determine that element is clickable using Selenium WebDriver with Ruby? 【发布时间】:2013-03-26 16:59:29 【问题描述】:

在我的网页上,页面加载但页面的子选项卡在 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 但是 sleep 并不是理想的处理方式,因为有时可能会发生子选项卡元素在睡眠时间之前或之后是可点击的。

使用睡眠,我做了以下 -

element = WAIT.until  driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")
sleep 20
element.click

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

是否有 Ruby 方法来检查元素是否可点击?以便我们知道何时点击。

【问题讨论】:

当你试图点击一个元素时,如果它不可用,你应该得到一个错误。你收到了吗? 不,它不会给出错误。仅当元素不存在时,click 才会出错。 参考 - selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/… Is there Ruby method to check whether element is clickable or not? - 无法理解。可点击是什么意思? 我们的方法可见吗?检查元素是否可见。我正在寻找类似的检查元素是否可点击。就我而言,我会等到子选项卡元素可以点击,一旦它可以点击,我就会点击它。实际上,我正在寻找一种方法来检查元素是否可点击。它不一定是一种方法。 【参考方案1】:

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

【讨论】:

工作出色【参考方案2】:

怎么样

WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(subTabHeaders)));

【讨论】:

可以参考一下它的文档吗?【参考方案3】:

希望对你有帮助:

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

【讨论】:

当我们说 element.click & 元素不可点击(假设元素存在)时,它不会返回 StaleElementReferenceError(如果元素不再存在则返回),它返回“”。我想要的是等到元素可以点击然后点击它。 不,我打算这样做不行 @grm 如果页面加载完成,那么元素应该出现在那里。在页面加载之前尝试点击元素会导致错误。 click 与 Ruby 的 clickAndWait 相同 我一直在寻找类似 Java 中的方法。见评论***.com/questions/9878478/…【参考方案4】:

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

    if (logOutLink.Exists() && ExpectedConditions.ElementToBeClickable(logOutLink).Equals(true))
    
        logOutLink.Click();
    
    else
    
        Browser.Goto("/");
    

【讨论】:

刚刚意识到这是针对 Ruby 的问题 - 答案在 C# 中

以上是关于如何使用 Selenium WebDriver 和 Ruby 确定该元素是可点击的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PHP绑定设置Selenium(WebDriver和Server)

如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]

如何使用 Selenium WebDriver 和 Java 处理日历弹出窗口?

如何使用selenium webdriver来判断一个网页加载完毕

如何在 Python 上使用 selenium webdriver 和 browsermob 代理捕获网络流量?

如何使用 Selenium WebDriver 处理登录弹出窗口?