如何验证登录模块中不同页面上的特定Web元素

时间:2019-03-26 00:01:19

标签: java selenium-webdriver data-driven

在我的应用程序中,当用户第一次登录时,然后在首页上显示用户名(使用@factory的数据驱动方法)。但是,如果用户注销并再次登录,则新页面将显示以下文字。

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

我的问题是如何检查此文本-'Click Here'是否存在,然后单击它并执行登录功能中提到的相同操作。

我尝试实现if-else块,以检查是否显示了该Webelement,然后单击它并执行与登录功能相同的操作。

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

请提出一种解决方案,以便每次登录时登录。

3 个答案:

答案 0 :(得分:1)

clickHere.isDisplayed()给出了NoSuchElementException,因为您要查找的UI上没有该元素。
因此,要解决您的问题,您可以通过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 :(得分:0)

(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异常,则可以更新以仅捕获该异常。

答案 2 :(得分:0)

您可以为您的PageObject和Baselet创建强大的ClassClass 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;
    }
}