t.me/atinfo_chat Telegram группа по автоматизации тестирования

Вот такое решение для проверки наличия элемента на странице Правильно или нет ?

Теги: #<Tag:0x00007f9b049ffb40> #<Tag:0x00007f9b049ff5a0>
 @FindBy(id = "tp-yes")
    List<WebElement> yesTpCheck;
    @FindBy(id = "tp-yes")
    WebElement yesTp;


public void travelPol(){
        if(!yesTpCheck.isEmpty()){
            yesTp.click();

        };
    }

я понимаю что тут один элемент используется дважды, под разным описанием и это костыль, и по хорошему надо просто проверять видим элемент или нет, но проверка на видимость всегда показывает что элемент виден, даже если его нет на странице.

public void travelPol(){
            if (yesTp.isEnabled()) {
                yesTp.click();
            }

во втором варианте элемента нет, но он заходит в метод как будто элемент есть, и соответственно не может на него кликнуть так как его нет, и тест падает

А чем не устраивают стандартный набор методов Вебдрайвера?

To check Visible:

if( driver.findElement(By.cssSelector("a > font")).isDisplayed()){
System.out.println("Element is Visible");
}else{
System.out.println("Element is InVisible");
}

To check Enable:

if( driver.findElement(By.cssSelector("a > font")).isEnabled()){
System.out.println("Element is Enable");
}else{
System.out.println("Element is Disabled");
}

вот эти методы не работают, в обоих случаях они падают на поиске так как элемента нет.

Надо ожидания добавить

public void travelPol(){
  
    private FluentWait<WebDriver> wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.visibilityOf(By.cssSelector("#tp-yes")));
...

Почему не написать один раз метод и не переиспользовать?

protected boolean isElementDisplayed(WebElement element) {
       boolean isVisible = false;
       try {
          isVisible = element.isDisplayed();
       } catch (NoSuchElementException ignored) {
       }
       return isVisible;
}
1 Симпатия
public boolean hasElement(WebElement element ) {
    try {
        return element.isDisplayed();
    } catch (NoSuchElementException ignored) {

    }
    return false;
}

в итоге я написал вот так, просто я думал есть какойто вариант у селениума, который я не знаю

1 Симпатия

Я задам свой обычный вопрос: а нафига в тесте if? В тесте не должно быть if. Тест - это не программа, не алгоритм, не оракул; тест должен точно знать, что проверять. Если должен быть элемент - кликай его. Если его нет - вались.

P.S. А вообще-то делается на Selenide в две строчки без всяких чёртовых ожиданий:

if ($("#tp-yes").exists())
$("#tp-yes").click();

1 Симпатия