在Selenium WebDriver测试中使用Page对象时遇到定义Xpath的问题

时间:2018-02-24 06:18:30

标签: java selenium selenium-webdriver pageobjects

Selenium newbie here ...我正在尝试创建我的第一个测试框架。

测试网站:https://www.phptravels.net/

测试用例:

  1. 打开浏览器并进入网页
  2. 加载页面后,点击MyAccount - >登录
  3. 我在页面对象类中使用了xpath,脚本只会在启动网页之前运行。它无法单击“登录”链接。

    我试图包含一个隐式等待,假设页面加载所用的时间比平时长。即使这样,问题仍然存在。

    你能帮我理解一下这个正确的xpath会起作用吗?

    代码:

    POM_HomePage.java

    package PageObjects;
    
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.support.FindBy;
    import org.openqa.selenium.support.PageFactory;
    
    public class POM_HomePage {
    
        WebDriver driver;
    
        public POM_HomePage(WebDriver driver) {
            this.driver=driver;
            PageFactory.initElements(driver, this);
        }
    
    
    
        @FindBy(xpath="//*[@id='li_myaccount']/ul/li[1]/a")
        WebElement LinkMyAccount;
        public WebElement clickMyAccount() {
            return LinkMyAccount;
        }
    
    
    }
    

    HomePage.java

    package TestGroupID;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    
    import org.testng.annotations.Test;
    
    import PageObjects.POM_HomePage;
    import Resources.MasterScript;
    
    
    public class HomePage extends MasterScript{
    
        @Test
        public void SignIn() throws IOException {
            driver=LoadBrowser();
            LoadPropFile();
            driver.get(prop.getProperty("test_website"));
            POM_HomePage pomHome=new POM_HomePage(driver);
            driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);
            if (pomHome.clickMyAccount().isDisplayed()) {
                pomHome.clickMyAccount().click();
                driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

根据您提出的问题加载页面 点击MyAccount - >登录。因此,您应该在两个单独的 WebElements 上调用click()方法。但是,POM_HomePage.java只返回一个 WebElement @FindBy(xpath="//*[@id='li_myaccount']/ul/li[1]/a")

解决方案

  • POM_HomePage.java中定义两个 WebElements 和两个关联的functions(),如下所示:

    • MyAccount Link

      @FindBy(xpath="//div[@class='navbar']//li[@id='li_myaccount']/a")
      WebElement LinkMyAccount;
      public WebElement clickMyAccount() {
          return LinkMyAccount;
      }
      
    • 登录链接

      @FindBy(xpath="//div[@class='navbar']//li[@id='li_myaccount']//ul[@class='dropdown-menu']/li/a[contains(.,'Login')]")
      WebElement LinkLogin;
      public WebElement clickLogin() {
          return LinkLogin;
      }
      
  • HomePage.java致电isDisplayed()click(),对于 WebElements ,如下所示:

    @Test
    public void SignIn() throws IOException {
        driver=LoadBrowser();
        LoadPropFile();
        driver.get(prop.getProperty("test_website"));
        POM_HomePage pomHome=new POM_HomePage(driver);
        driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);
        if (pomHome.clickMyAccount().isDisplayed()) {
                pomHome.clickMyAccount().click();
        }
        if (pomHome.clickLogin().isDisplayed()) {
            pomHome.clickLogin().click();
        }
    }