Java Selenium TestNG依赖项澄清设计

Java Selenium TestNG依赖项澄清设计,java,selenium,testng,Java,Selenium,Testng,由于我正在使用我的课程中的UDE测试NG,我需要澄清依赖部分。下面我有一个登录gmail的方法 称为gmailLogin()。我有一个单独的方法在Gmail搜索框中搜索一个主题(登录后),称为Gmail搜索() 您需要登录您的Gmail帐户才能执行搜索。我做了两件事来做实验 1) 在Gmail()中提供了不正确的信息。这将失败。 2) 我没有在gmailSearch()中使用dependsOnMethods=“gmailogin” Test Gmail search()不会失败,因为它使用来自@

由于我正在使用我的课程中的UDE测试NG,我需要澄清依赖部分。下面我有一个登录gmail的方法 称为gmailLogin()。我有一个单独的方法在Gmail搜索框中搜索一个主题(登录后),称为Gmail搜索()

您需要登录您的Gmail帐户才能执行搜索。我做了两件事来做实验

1) 在Gmail()中提供了不正确的信息。这将失败。 2) 我没有在gmailSearch()中使用dependsOnMethods=“gmailogin”

Test Gmail search()不会失败,因为它使用来自@BeforeMethod的google主页搜索。谷歌主页的搜索也使用name='q'

问:设计gmailSearch()方法以使其被迫使用gmailogin()的好方法是什么?如果当前流程是一个糟糕的设计,那么我应该合并吗 登录和搜索1方法

提前感谢您花时间解释/回答

public class GoogleTest {

    static WebDriver driver;    

    @BeforeMethod
    public void setUp(){
        System.setProperty("webdriver.chrome.driver", "path");
        driver=new ChromeDriver();
        driver.get("http://www.google.com");
        driver.manage().window().maximize();
    }

    @Test(priority=1)
    public void googleSearch(){
        driver.findElement(By.xpath("//input[@name='q']")).sendKeys("news");
        driver.findElement(By.xpath("//input[@value='Google Search']")).click();
        if(driver.getPageSource().contains("www.foxnews.com")){
            System.out.print("Search found");
        }       
    }
    @Test(priority=2,groups="Gmail")
    public void gmailIcon(){
        driver.findElement(By.xpath("//a[@href='https://mail.google.com/mail/?tab=wm']")).click();
        if(driver.getTitle().contains("Gmail")){
            System.out.print("Gmail found");
        }       
    }
    @Test(priority=2,groups="Gmail")
    public void gmailLogin(){
        WebDriverWait wait = new WebDriverWait(driver,30);

        driver.get("https://accounts.google.com/signin/v2/identifier?continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&service=mail&sacu=1&rip=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin");
        driver.findElement(By.xpath("//input[@type='email']")).sendKeys("aname@gmail.com");
        driver.findElement(By.xpath("//span[contains(text(),'Next')]")).click();
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@type='password']")));
        driver.findElement(By.xpath("//input[@type='password']")).sendKeys("psd123");
        driver.findElement(By.xpath("//span[contains(text(),'Next')]")).click();
        if(driver.getTitle().contains("Inbox")){
            System.out.print("Gmail Inbox");
        }       
    }
    @Test(groups="Gmail")
    public void gmailSearch(){
        driver.findElement(By.xpath("//input[@name='q']")).sendKeys("QA"+ "\n");
        if(driver.getTitle().contains("Search Results")){
            System.out.print("Gmail Search");
        }       
    }
    @AfterMethod
    public void testDown(){
        driver.quit();
    }
}

你只有一个类,这不是一个好主意,你需要为每个页面有单独的类。 最好使用POM(页面对象模型)。在您的情况下,您有两个不同的页面,登录页面和Gmail页面。因此,你需要为每一个类。然后您可以为您的测试用例创建类。例如,login和search,在这个类中,您可以调用login和search。 您还需要验证登录,然后开始搜索(您可以进行一个测试来检查用户名,以确保用户已登录,如果没有问题,则可以执行测试)。 使用POM将帮助您更好地管理测试,尤其是当您的测试项目很大时。
您可以阅读有关POM的更多信息。

对于第一个问题,您应该使用
dependsOnMethods
创建方法依赖关系。也就是说,methodB应该只在methodA之后执行,然后methodB应该具有dependsOnMethods=“methodA”

@Test(dependsOnMethods=“methodA”)


如果您是Selenium automation的新手,您的测试看起来还可以。但它可以改进得更好。您试图在一个类中处理所有问题

这个类执行以下操作

  • 运行测试
  • 管理webdriver实例的生命周期
  • 应用程序业务逻辑
  • 测试数据管理
理想情况下,每个类应该只有一个职责。我建议你看看下面的网站,以便更好地设计


谢谢Hamid,我也会尝试POM概念。我想看看是否有办法使用TestNG依赖项。