如何从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);
答案 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将花费大量时间),此示例将无法正常工作!