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

时间:2013-05-29 14:46:28

标签: selenium-webdriver wait findby

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

我正在使用一个自构的webDriverWait函数,该函数将能够接收By或Webelement以在presenceOfElementLocated()函数中使用。

定义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类型和字符串。 这个implimintation不好: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);

1 个答案:

答案 0 :(得分: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将花费大量时间),此示例将无法正常工作!