Как проверить конкретный веб-элемент на другой странице в модуле входа

#java #selenium-webdriver #data-driven

#java #selenium-webdriver #управляемый данными

Вопрос:

В моем приложении при первом входе пользователя в систему отображается имя пользователя на первой странице (подход, основанный на данных, с использованием @factory). Но если пользователь выходит из системы и снова входит в систему, то появляются новые страницы со следующим текстом.

 You're signed out now.
Click here to sign in again.
  

Мой вопрос заключается в том, как проверить, присутствует ли этот текст -«Нажмите здесь», затем нажмите на него и выполните те же действия, что упомянуты в функции входа.

Я попытался реализовать блок if-else, чтобы проверить, отображается ли этот веб-элемент, затем щелкнуть по нему и выполнить то же действие, что и в функции входа в систему. Но он выдает ошибку, которая

 org.openqa.selenium.NoSuchElementException: Cannot locate an element using xpath=//a[@href='/Account/Login']
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
  

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

  @FindBy(xpath="//a[@href='/Account/Login']")
WebElement clickHere;
  

//функция для проверки

 if (clickHere.isDisplayed())
      {   
          clickHere.click();
          username.sendKeys(strUsername);
          nextBtn.click();
          password.sendKeys(strPassword);
          loginButton.click();
          System.out.println("Successfully Logged");
      }
      else
          {

          username.sendKeys(strUsername);
          nextBtn.click();
          password.sendKeys(strPassword);
          loginButton.click();
          System.out.println("Successfully Logged");
          }
  

Пожалуйста, предложите решение для проверки функции входа в систему каждый раз.

Ответ №1:

clickHere.isDisplayed() выдает ошибку, NoSuchElementException поскольку элемент отсутствует в пользовательском интерфейсе, в котором вы пытаетесь его найти.
Итак, чтобы решить вашу проблему, вы можете получить список элемента через pagefactory, а затем определить размер этого списка, если размер больше 0, это означает, что элемент присутствует на странице, иначе элемент отсутствует.

Вам нужно внести следующие изменения в свой код, и тогда он будет работать нормально:
Вам нужно получить список элементов с помощью:

 @FindAllBy(xpath="//a[@href='/Account/Login']")
List<WebElement> clickHere;
  

И внесите следующие изменения в свой код:

 if (clickHere.size()>0){   
      clickHere.get(0).click();
      username.sendKeys(strUsername);
      nextBtn.click();
      password.sendKeys(strPassword);
      loginButton.click();
      System.out.println("Successfully Logged");
 }
 else{
      username.sendKeys(strUsername);
      nextBtn.click();
      password.sendKeys(strPassword);
      loginButton.click();
      System.out.println("Successfully Logged");
 }
  

Комментарии:

1. спасибо за ответ. Я сделал то же, что вы упомянули, но после ввода clickHere. — это не заполнение действия «щелкнуть».

2. @Samy да, я допустил небольшую ошибку в своем коде. Пожалуйста, попробуйте обновленный код. Это должно работать нормально.

3. да, сейчас все работает нормально .. но единственная проблема в том, что сначала требуется много времени для запуска входа в систему .. может быть, из-за неявного ожидания, которое я применил перед запуском моего проекта… можем ли мы сделать что-нибудь, чтобы начать как в обычном интервале времени.

4. @Samy Условие проверки того, что размер списка больше 0, действительно занимает некоторое время, когда элемент отсутствует на странице, потому что сначала элемент находит элемент на всей странице, а затем также ожидает неявного ожидания, а затем отправляет сообщение о том, что размер списка равен 0. Однако это будет работать очень быстро, когда элемент присутствует на странице. Таким образом, мы ничего не можем с этим поделать, вы можете уменьшить неявное ожидание, если другие ваши элементы не затрагиваются.

Ответ №2:

Замените (clickHere.isDisplayed()) на приведенное ниже.

 if(driver.findElements(By.xpath("//a[@href='/Account/Login']") ).size() != 0)
  

если вы хотите придерживаться своего pagefactory, вы можете использовать следующий подход

 // below line will click on the "Click Here" link if only it's present
try {clickHere.click();}catch(Exception e) {}
username.sendKeys(strUsername);
nextBtn.click();
password.sendKeys(strPassword);
loginButton.click();
System.out.println("Successfully Logged");
  

если вы хотите перехватить только NoSuchElementPresent исключение, вы можете обновить, чтобы перехватывать только это.

Ответ №3:

Вы можете создать базовый класс для вас PageObject и внедрить метод isElementOnPage

Базовый класс:

 public class BasePage {

    private WebDriver driver;

    public BasePage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    protected boolean isElementOnPage(WebElement webElement) {
        try {
            webElement.getTagName();
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}
  

Ваш класс:

 public class PageClass extends BasePage {

    @FindBy(xpath="//a[@href='/Account/Login']")
    private WebElement clickHere;

    public PageClass(WebDriver driver) {
        super(driver);
    }

    public PageClass YourMethod(){
        if(isElementOnPage(clickHere)){
            clickHere.click();
            // your logic here
        }else {
            // your logic here
        }

        return this;
    }
}