使用Ruby的Selenium中Java的elementToBeClickable等效什么?

时间:2018-10-17 21:03:26

标签: ruby selenium

我是自动化框架的Ruby脚本的新手。我正在尝试将Selenium和Ruby组合用于自动化框架。我发现的是,Ruby硒中没有elementToBeClickable吗?我有一个脚本,可以使用常规click方法在元素上单击。但是,单击不起作用,元素也不会被单击。因此,我正在考虑等待元素可单击,但是Selenium的ruby库没有Java和C#中的那种方法。你们如何等待该元素在Ruby中可点击?

  def click_more_actions_button
    more_actions_id = 'btnMoreActions'
    el = @wd.find_element(id: more_actions_id)
    el.click
  end

2 个答案:

答案 0 :(得分:0)

wait.until(ExpectedConditions.elementToBeClickable (By.id("foo")));

下面几行与上面的Java代码完全等效,

wait.until { driver.find_element(id: "foo").enabled? }

事实是java中的elementToBeClickable方法具有误导性,实际上它将检查元素的启用状态。

请参阅ExpectedContions.java中elementToBeClickable的实现,

  /**
   * An expectation for checking an element is visible and enabled such that you can click it.
   *
   * @param locator used to find the element
   * @return the WebElement once it is located and clickable (visible and enabled)
   */
  public static ExpectedCondition<WebElement> elementToBeClickable(final By locator) {
    return new ExpectedCondition<WebElement>() {
      @Override
      public WebElement apply(WebDriver driver) {
        WebElement element = visibilityOfElementLocated(locator).apply(driver);
        try {
          if (element != null && element.isEnabled()) {
            return element;
          }
          return null;
        } catch (StaleElementReferenceException e) {
          return null;
        }
      }

      @Override
      public String toString() {
        return "element to be clickable: " + locator;
      }
    };
  }

在github中引用this

答案 1 :(得分:0)

实际上,Ruby编程语言中没有这种直接方法。

这里是检查并等待直到元素显示并启用对其执行操作(如单击,send_keys等)的替代方法:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
element = wait.until{
   tmp_element = driver.find_element(:name, 'password')
   tmp_element if tmp_element.enabled? && tmp_element.displayed?
}

使用wait.until,我们可以做到。
希望对您有帮助。如有任何疑问,请随时提问。