我正在尝试在我的框架中创建一个显式的wait方法来处理用户的输入。该方法应该处理所有类型的搜索:id,xpath和css。 但是,当我尝试测试此方法时,错误返回奇怪的错误
显式等待方法
m
我收到的错误:
public static void isDisplaying(String variable){
wait = new WebDriverWait(driver,3);
System.out.println("Looking for: " + variable);
if (driver.findElement(By.id(variable)).isDisplayed()){
System.out.println("Found variable via id");
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(variable)));
} else if (driver.findElement(By.xpath(variable)).isDisplayed()) {
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(variable)));
System.out.println("Found variable via xpath");
} else if (driver.findElement(By.cssSelector(variable)).isDisplayed()){
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(variable)));
System.out.println("Found variable via css");
} else {
System.out.println(variable +" is not displayed.");
}
}
我不知道为什么它会返回带有所有后退和正斜杠的值。我的猜测是,一旦尝试使用id搜索xpath字符串,应用程序就会失败。但是,如果声明,它不应该转移到下一个其他地方吗?如果这确实是问题,我应该如何处理这个问题呢?
当我只是找到元素并单击时,它可以正常工作并返回正确的路径:
org.openqa.selenium.NoSuchElementException: Unable to locate element: #\/\/div\[\@id\=\'slideOut\-nav\'\]\/ul\/li\[2\]\/a
我一直坚持这个问题,所以任何帮助都会非常感激!!
答案 0 :(得分:1)
如果找不到该元素,对driver.findElement(By.id(variable))
的调用必然会立即抛出异常。
尝试用driver.findElement()
替换对driver.findElements()
的调用,因为此调用不会抛出异常,但会在调用失败时返回一个空的webelements列表。
如果您真的想要构建一个通用方法,那么您应首先解析variable
内容以查看它是否代表xPath
或css
,最后再回到使用{{} 1}}。
您可以查看this implementation以供参考。
答案 1 :(得分:0)
我不确定你的功能是做什么的。您正在检查是否显示该元素,然后是否等待显示该元素。如果显示元素,则它已经可见。
传递定位器String
,而不是传递By
。传递定位器减少了必须检查所有不同的定位器类型。
我已为您的功能添加了boolean
的返回类型,以便您可以重复使用它。它等待最多3秒钟才能看到元素。如果它没有超时,则元素可见并返回true
。如果确实超时,则元素不可见并返回false
。您可以将代码减少到下面。
public static boolean isDisplaying(By locator)
{
try
{
new WebDriverWait(driver, 3).until(ExpectedConditions.visibilityOfElementLocated(locator));
return true;
}
catch (TimeoutException e)
{
return false;
}
}
你会称之为
System.out.println(isDisplaying(By.xpath("//div[@id='slideOut-nav']/ul/li[2]/a")));
或
System.out.println(isDisplaying(By.id("someId")));
答案 2 :(得分:0)
public void waitUntilElementclickable(WebElement element){
//Waits Until Element is Clickable on screen
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(element));
}