#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;
}
}