Selenium Eclipse Test Suite测试在套件中失败,但在单独运行时是成功的

时间:2017-10-10 17:57:56

标签: java eclipse selenium testing

我有以下测试套件来运行自动化脚本来登录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();
        }

1 个答案:

答案 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){...} 

这应该有效。让我知道事情的后续。