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

Java 如何在登录模块中验证不同页面上的特定web元素,java,selenium-webdriver,data-driven,Java,Selenium Webdriver,Data Driven,在我的应用程序中,当用户首次登录时,在第一页上显示用户名,数据驱动方法使用@factory。但若用户注销并再次登录,则会出现一个新页面,其中包含以下文本 You're signed out now. Click here to sign in again. 我的问题是如何检查文本-‘单击此处’是否存在,然后单击它并执行登录功能中提到的相同操作 我尝试实现if-else块来检查是否显示了这个webelement,然后单击它并执行与登录函数中相同的操作。但这是一个错误 org.openqa.sel

在我的应用程序中,当用户首次登录时,在第一页上显示用户名,数据驱动方法使用@factory。但若用户注销并再次登录,则会出现一个新页面,其中包含以下文本

You're signed out now.
Click here to sign in again.
我的问题是如何检查文本-‘单击此处’是否存在,然后单击它并执行登录功能中提到的相同操作

我尝试实现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");
          }
请建议一种解决方案,以便每次都签入登录功能。

将单击此处替换为下面显示的

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");
如果您只想捕获NoTouchElementPresent异常,则可以进行更新以仅捕获该异常。

单击此处。isDisplayed将提供NoTouchElementException,因为您试图查找它的UI上不存在该元素。 因此,为了解决您的问题,您可以通过pagefactory获取元素的列表,然后可以找到该列表的大小,如果大小大于0,则表示该元素存在于页面上,否则该元素不存在

您需要在代码中进行以下更改,然后就可以正常工作了: 您需要使用以下方法获取元素列表:

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

您可以为PageObject和Imponent metchod 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;
    }
}

谢谢你的回复。我做了和你提到的一样的事情,但是在键入clickHere之后它不是填充“点击”操作。@Samy是的,我的代码中有一点错误。请尝试更新的代码。它应该可以正常工作。是的,它现在可以正常工作。但唯一的问题是,首先开始登录需要很多时间。可能是因为我在启动项目之前应用了隐式等待…我们可以做一些事情以正常时间间隔启动吗。@Samy检查列表大小是否大于0的条件在元素在页面上不存在,因为它首先在整个页面上找到元素,然后等待隐式等待,然后发送列表大小等于0的消息。但是,当元素出现在页面上时,它的工作速度会非常快。所以我们对此无能为力,如果其他元素没有受到影响,可以减少隐式等待。
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;
    }
}