driver.findElement(By.linkText(“”))在一个测试中工作但在另一个测试中抛出异常

时间:2012-05-10 14:00:59

标签: selenium-webdriver testng

我正在尝试在同一个类中编写两个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”:“链接文字”,“选择器”:“帐户”}

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

任何输入都会受到重视。 感谢。

3 个答案:

答案 0 :(得分:1)

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

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

  1. 到达createAccount()测试时,元素不会出现 或
  2. 在登录前调用createAccount,因此帐户链接不可用。
  3. 如果您希望测试用例按特定顺序执行,则使用dependsOnMethods并使createAccount依赖于testLogin方法。 (参考Testng Dependent methods

答案 1 :(得分:0)

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

你确定你在@BeforeClass之后吗?

答案 2 :(得分:0)

我猜你的第二个测试方法是先执行的。它需要执行第一种方法(登录)才能获得“帐户”链接。您需要在第二个方法中使用dependsOnMethod,以便testLogin将执行1st,然后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()将执行1st,然后执行testCreateAccount()方法,以便您所需的点击链接不会错过