我有以下测试套件来运行自动化脚本来登录gmail然后另一个脚本来单击Compose按钮:
TestSuite.xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Web Admin Tests" parallel="false">
<test name="BOS - Account Class">
<classes>
<class name="secondtestngpackage.GmailComposeEmail" />
<class name="secondtestngpackage.GmailLogin" />
</classes>
</test>
</suite>
当我运行这个测试套件时,第一个测试没有通过gmail中的登录屏幕,但第二个测试确实如此,即使它们引用了相同的功能。这有什么原因会发生吗?一个测试能够输入用户ID和密码,因为它是第二个/最后一个测试,但是当第一个测试运行时,就像第二个测试干扰它一样,因为它的浏览器现在处于焦点。
GmailLogin.java:
@BeforeTest
public void launchBrowser() {
ReuseFunctions.OpenApp("Chrome", "https://gmail.com");
}
//Test 1: Log into Gmail
@Test(priority=1)
public void LoginToGmailAccount() {
**GmailComposeEmail.java**
@BeforeTest
public void launchBrowser() {
ReuseFunctions.OpenApp("Chrome", "https://gmail.com");
}
@Test(priority=2)
public void LoginToGmailAccount() {
可重复使用的功能文件:
ReuseFunctions.func_EnterCredentials("username", "password");
public class ReuseFunctions {
public static WebDriver driver;
/*Function 1: Select Browser and Open Application Function
*/
public static Object OpenApp (String Browser, String URL) {
//Receive Browser Name Function
Func_LaunchBrowser(Browser);
//Receive Website and Open Function
func_OpenURL(URL);
return driver;
}
//Select Browser
public static WebDriver Func_LaunchBrowser(String Browser) {
String driverPath = "C:/EclipseJavaDev/";
if(Browser=="Chrome"){
System.out.println("launching chrome browser");
System.setProperty("webdriver.chrome.driver", driverPath+"chromedriver.exe");
driver = new ChromeDriver();
}else if(Browser=="FF"){
driver= new FirefoxDriver();
}else if(Browser=="IE"){
System.setProperty("webdriver.ie.driver", "Drivers\\IEDriverServer.exe");
driver= new InternetExplorerDriver();
}
driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS);
return driver;
}
//Open URL
public static void func_OpenURL(String URL){
driver.get(URL);
driver.manage().window().maximize();
}
答案 0 :(得分:0)
问题在于实例化WebDriver
实例的位置。将每个WebDriver
实例视为唯一的浏览器会话。因此,确保每个测试获得自己的驱动程序实例(浏览器会话)的最安全方法是在Test类初始化它,而不是常见的帮助程序类。
GmailLogin:
// Initialize Webdriver and then asks your common function to return it
private WebDriver driver;
@BeforeTest
public void launchBrowser() {
driver = ReuseFunctions.OpenApp("Chrome", "https://gmail.com");
}
@Test(priority=1)
public void LoginToGmailAccount() {
// pass driver as a method argument to other methods
}
//Don't forget to close the browser
@AfterTest
public void quitBrowser() {
driver.quit();
}
重构你的另一个Test类与上面相同。 (或者如果你真的需要另一个类,可以重新考虑。你可以在同一个类中添加另一个方法,并使用priority
和/或dependsOnMethods
attributes来控制执行顺序。但这是一个不同的主题和超出这个问题的范围:))。
ReuseFunctions:
// Remove the global Webdriver instantiation
//Change return type from Object to WebDriver
public static WebDriver OpenApp (String Browser, String URL) {
WebDriver driver = Func_LaunchBrowser(Browser);
func_OpenURL(URL, driver); //pass in the driver as arg
return driver;
}
//Refactor openUrl method to use the driver from arg
public static void func_OpenURL(String URL, WebDriver driver){...}
这应该有效。让我知道事情的后续。