我正在尝试在同一个类中编写两个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()测试中,它可以工作。我想在同一个浏览器会话中运行所有测试。
任何输入都会受到重视。 感谢。
答案 0 :(得分:1)
@BeforeClass只为一个类运行一次。因此,如果您将两个测试保持在同一个类中,则执行顺序为@beforeClass,您的第一个测试用例,然后是您的第二个测试用例(您的帐户链接应该在您进行此测试时可见)。
测试的顺序不是保证。因此,如果帐户链接仅在您登录后可见,则可能不是您的案例始终通过。所以,问题可能是
如果您希望测试用例按特定顺序执行,则使用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()方法,以便您所需的点击链接不会错过