【问题标题】:driver.findElement(By.linkText("")) working in one test but throwing exception in anotherdriver.findElement(By.linkText("")) 在一个测试中工作但在另一个测试中抛出异常
【发布时间】:2012-08-11 15:15:58
【问题描述】:

我正在尝试在同一个类中编写两个 testng 测试(使用 Selenium webdriver)——一个登录到应用程序,另一个创建一个新帐户。

这些是我正在遵循的步骤 - 使用@BeforeClass在firefox浏览器上打开应用程序

@BeforeClass
public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "http://www.salesforce.com";
    driver.get(baseUrl + "/");
}
  • 第一次登录网站测试

    @Test
    public void testLogin() throws Exception {
    driver.findElement(By.id("username")).sendKeys(strUsername);
    driver.findElement(By.id("password")).sendKeys(strPassword);
    driver.findElement(By.id("Login")).click();
    

    }

  • 创建新帐户的第二次测试

    @Test
    public void createAccount() throws Exception {
    driver.findElement(By.linkText("Accounts")).click();
    ************************
            ************************
            ************************
            ************************
            ************************
    

    }

我的问题是,当我运行这个 testng 测试时,我在第二个测试中遇到异常: org.openqa.selenium.NoSuchElementException: 无法定位元素:{"method":"link text","selector":"Accounts"}

但如果我包含命令“driver.findElement(By.linkText("Accounts")).click();”在 testLogin() 测试中,它可以工作。我想在同一个浏览器会话中运行我的所有测试。

任何输入将不胜感激。 谢谢。

【问题讨论】:

    标签: selenium-webdriver testng


    【解决方案1】:

    @BeforeClass 只为一个类运行一次。因此,如果您将两个测试都放在同一个类中,则执行顺序是 @beforeClass ,您的第一个测试用例,然后是您的第二个测试用例(您的帐户链接应该在您到达此测试时可见)。

    不保证测试的顺序。因此,如果帐户链接仅在您登录后可见,那么您的案例可能不会一直通过。所以,问题可能是

    1. 在达到您的 createAccount() 测试时,该元素尚未出现 或
    2. createAccount 在登录前被调用,因此帐户链接不可用。

    如果您希望您的测试用例按特定顺序执行,请使用 dependsOnMethods 并使 createAccount 依赖于 testLogin 方法。 (参考Testng Dependent methods

    【讨论】:

    • 谢谢 niharika_neo。 createAccount 在 testLogin 之前运行,所以我遇到了异常。使用 dependsOnMethods 解决了这个问题。
    【解决方案2】:

    @BeforeClass 将为每个单独的测试运行您的设置方法 - 因此对于测试 1,将创建一个新的 Firefox 浏览器并登录。对于第二个测试,将创建另一个新的 Firefox 浏览器,它会尝试找到 Accounts 链接 - 我假设它仅在您登录时显示,但是此时第二个浏览器不会登录。

    你确定你在@BeforeClass 之后吗?

    【讨论】:

    • 在 testng 中,测试在同一个浏览器窗口中运行,但 createAccount() 方法在 login() 之前被调用,因此它抛出了异常。使用 dependsOnMethods 解决了这个问题。
    【解决方案3】:

    我猜你的第二个测试方法首先被执行。它需要执行第一种方法(用于登录)以获取“帐户”链接。您需要在第二个方法中使用dependsOnMethod,以便testLogin 将执行第一个然后createAccountMethod。 @BeforeClass 似乎可以使用您的 setUp() 方法。因此,保持 setUp() 方法不变。将其他两种方法声明为:

    @Test
    public void testLogin() throws Exception {
    //your code here
    }
    @Test(dependsOnMethods{"testLogin"})
    public void testCreateAccount() throws Exception {
    //your code here
    }
    

    在上面的代码中,testLogin() 将执行第一个然后是 testCreateAccount() 方法,这样您想要点击的链接就不会错过

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 2023-01-25
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      相关资源
      最近更新 更多