Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

selenium
java
Теги: #<Tag:0x00007f7b653e3568> #<Tag:0x00007f7b653e32c0>

(pauloo89) #1
 @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();
            }

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


(Виталий Коряков) #2

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


(pauloo89) #3

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");
}

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


(Sergey Korol) #4

(Yaroslav Pernerovskyy) #5

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

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

(Aleksey Ilyenko) #6

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

protected boolean isElementDisplayed(WebElement element) {
       boolean isVisible = false;
       try {
          isVisible = element.isDisplayed();
       } catch (NoSuchElementException ignored) {
       }
       return isVisible;
}

(pauloo89) #7
public boolean hasElement(WebElement element ) {
    try {
        return element.isDisplayed();
    } catch (NoSuchElementException ignored) {

    }
    return false;
}

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


(asolntsev) #8

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

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

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


(Mykhailo Poliarush) #9