Метод Selenium visibilityOf - Кажется, не работает?
Когда я использовал перечисленный метод, чтобы увидеть, является ли элемент видимым на странице, я получил исключение, сообщающее, что он не может найти элемент, используя указанный локатор.
Любые идеи, кто-нибудь сталкивался с этой проблемой раньше или даже есть лучший метод?
public boolean isElementPresentByWebElement(WebElement element) {
Wait<WebDriver> fluentWait = new FluentWait<WebDriver>(driver).withTimeout(15, TimeUnit.SECONDS)
.pollingEvery(1, TimeUnit.SECONDS).ignoring(NoSuchElementException.class);
for (int i = 0; i < 2; i++) {
try {
fluentWait.until(ExpectedConditions.visibilityOf(element));
System.out.println("Element is visible: " + element.toString());
return true;
} catch (Exception e) {
System.out.println(
"Unable to locate the element: " + element.toString() + ", Exception: " + e.toString());
throw (e);
}
}
return false;
}
2 ответа
Я думаю, что ваш код слишком сложен для того, что вы пытаетесь сделать. Есть встроенный класс, ExpectedConditions
будет делать то, что вы хотите. Вы также зацикливаетесь на ожидании, которое не нужно. Я бы предложил, чтобы вы перешли в локатор (By
) вместо WebElement
, Это расширит ваши возможности использования этой функции, потому что вам не придется находить элемент перед использованием функции.
public boolean isElementPresentByLocator(By locator)
{
try
{
new WebDriverWait(driver, 15).until(ExpectedConditions.visibilityOfElementLocated(locator));
System.out.println("Element is visible: " + locator.toString());
return true;
}
catch (TimeoutException e)
{
System.out.println("Unable to locate the element: " + locator.toString() + ", Exception: " + e.toString());
return false;
}
}
Код ниже - это скорее прямой перевод и упрощение вашего кода.
public boolean isElementPresentByWebElement(WebElement element)
{
try
{
new WebDriverWait(driver, 15).until(ExpectedConditions.visibilityOf(element));
System.out.println("Element is visible: " + element.toString());
return true;
}
catch (TimeoutException e)
{
System.out.println("Unable to locate the element: " + element.toString() + ", Exception: " + e.toString());
return false;
}
}
Обновлено:
попробуйте использовать следующее:
int waitCounter = 0;
public static void WaitUntilVisible(WebDriver driver, WebElement element) throws InterruptedException, IOException {
try {
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOf(elementToBeClicked));
if (!elementToBeClicked.isDisplayed()) {
System.out.println("Element not visible yet. waiting some more for " + element);
if (waitCounter < 3) {
waitCounter++;
WaitUntilVisible(element);
}
waitCounter = 0;
}
} catch (Exception e)
{
System.out.println("Handling exception");
}
}