2

如何Findby从 a 获取类型和字符串WebElement

我正在使用一个自建webDriverWait函数,该函数将能够接收 By Or Webelement 以在 presentOfElementLocated() 函数中使用。

定义 WebElement

@FindBy(xpath = "//div[@id='calendar-1234']") 
private WebElement calander;

两个 webDriverWaitFor 函数
第一个使用 By 并且工作正常:,第二个使用 webElement

public void webDriverWaitFor(WebDriver driver, By by) throws ElementLocatorException {
    try{
        (new WebDriverWait(driver, 5))
        .until(ExpectedConditions.presenceOfElementLocated( by ));
    }
    catch (Exception e) {
        throw new ElementLocatorException(by);
    }

}

第二个使用 WebElement,我正在尝试获取 By 类型和字符串。这个暗示不好:By.id(webElement.getAttribute("id"))

public void webDriverWaitFor(WebDriver driver, WebElement webElement) throws ElementLocatorException {
    try{
        (new WebDriverWait(driver, 5))
        .until(ExpectedConditions.presenceOfElementLocated(  By.id(webElement.getAttribute("id")) ));
    }
    catch (Exception e) {
        throw new ElementLocatorException( By.id(webElement.getAttribute("id")) );
    }

}

我将如何实施以下内容?

webDriverWaitFor(driver, calander);
4

1 回答 1

0

通常你可以调用element.toString()并解析它。返回的字符串包含所有必要的信息。

但它不适用于您的情况,因为只有在 WebElement 实例化后才能获得此信息。您正在使用 @FindBy 标记,这意味着该元素将在您尝试使用它的那一刻被查找。您的示例不起作用,因为当您尝试调用 webElement.getAttribute 时 driver.findBy 在内部被调用,并且由于元素尚不存在而失败。

我能想到的唯一解决方案是编写自己的等待方法

public boolean isElementPresent(WebElement element) {
   try {
      element.isDisplayed();  // we need to call any method on the element in order to force Selenium to look it up
      return true;
   } catch (Exception e) {
      return false;
   }
}

public void webDriverWaitFor(WebElement element) {
   for (int second = 0; ; second++) {
      if (second >= 60) {
         //element not found, log the error
         break;
      }
      if (isElementPresent(element)) {
         //ok, we found the element
         break;
      }
      Thread.sleep(1000);
   }
}

但是,如果您使用隐式等待(每次尝试调用 element.isDisplayed 将花费大量时间),此示例将无法正常工作!

于 2013-05-30T23:11:27.873 回答