我已经完成了一些搜索,但我仍然遇到同样的问题。我相信它可能是由于我的webdriver是静态的?我不太确定......
在我的主要课程中,我添加了@BeforeTest
和@AfterTest
。
@BeforeTest
包括根据我的XML文件启动新浏览器
@AfterTest
包含driver.quit()
,它应该会终止会话/驱动程序,以便第二次测试可以从@BeforeTest
获得一个干净的驱动程序,不是吗?
这是我的浏览器声明:
public class Browser {
public static WebDriver driver;
//Variable initialization
public static String title;
public static String url;
public static String currentBrowser;
public static boolean jseWorkAround;
public Browser(){
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
//Browser launch
public static void launch(String browser){
if(browser.equalsIgnoreCase("firefox")){
driver = new FirefoxDriver();
currentBrowser = "Firefox/";
jseWorkAround = false;
System.out.println("Firefox Selected");
} else if (browser.equalsIgnoreCase("chrome")){
driver = new ChromeDriver();
currentBrowser = "Chrome/";
jseWorkAround = false;
System.out.println("Chrome Selected");
} else if (browser.equalsIgnoreCase("edge")){
driver = new EdgeDriver();
currentBrowser = "Edge/";
jseWorkAround = true;
System.out.println("Edge selected");
} else if (browser.equalsIgnoreCase("ie")){
driver = new InternetExplorerDriver();
currentBrowser = "IE/";
jseWorkAround = true;
System.out.println("IE Driver Selected");
} else if (browser.equalsIgnoreCase("background")){
driver = new PhantomJSDriver();
currentBrowser = "Background/";
jseWorkAround = false;
System.out.println("Background selected");
} else {
throw new IllegalArgumentException("Invalid Browser");
}
}
public static void quit(){
driver.quit();
}
public static void goToPage(String pageurl){
driver.get(pageurl);
}
这是一个随机抽样测试:
@Parameters({"browser"})
@BeforeTest
public void browserSelection(String browser){
Browser.launch(browser);
}
@AfterTest
public void cleanupAfterTest(){
Print.line("Test complete. Cleaning up...");
Browser.quit();
}
@Test
public void Test1() {
Browser.goToPage("http://www.google.com");
Screenshot.page("Goes to google");
}
@Test
public void Test2() {
Browser.goToPage("http://www.yahoo.com");
Screenshot.page("Goes to yahoo");
}
我注意到,当事情开始因错误而失败时,它始终是第二次测试的结束"在调用quit"之后调用webdriver。
浏览器之间的测试按照我的testng.xml
文件中提到的顺序依次进行。
如果我先运行firefox,那么chrome,chrome test将在最后@Test
失败。
然而,如果我先运行chrome然后是firefox,那么firefox会在最后@Test
上失败。
以下是错误消息......
org.openqa.selenium.NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?
Build info: version: 'unknown', revision: '1969d75', time: '2016-10-18 09:43:45 -0700'
System info: host: 'DESKTOP-5ED0H7O', ip: '10.0.9.239', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_121'
Driver info: driver.version: RemoteWebDriver
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:130)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601)
at org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:537)
at utility.Scroll.toText(Scroll.java:43)
at tests.TestCases.TCID20(TestCases.java:390)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:744)
at org.testng.TestRunner.run(TestRunner.java:602)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
at org.testng.TestNG.runSuites(TestNG.java:1144)
at org.testng.TestNG.run(TestNG.java:1115)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)
这种随机失败严重损害了我的进步。如果我在我的XML文件上一次只启用一个浏览器而没有其他浏览器,则没有任何失败。
答案 0 :(得分:2)
我看到您的问题是在加载浏览器之前@test运行(您必须增加等待时间)。另一件事是您尚未添加任何优先级。毕竟,这是您获取浏览器的方式。您必须使用geckodriver,chromedriver等。
尝试获取如下所示的浏览器
if (browser.equalsIgnoreCase("chrome")){
System.setProperty("webdriver.chrome.driver", "/Path/ToChromeDriver/chromedriver.exe");
driver = new ChromeDriver();
System.out.println("Chrome Selected");
}
添加如下所示的优先级
Browser browser;
@Parameters({"browser"})
@BeforeTest
public void browserSelection(String browser){
browser.launch(browser);
thread.sleep(5000);//Not recommended but timeout also may be an issue if so increase implicitly wait time
}
@AfterTest
public void cleanupAfterTest(){
Print.line("Test complete. Cleaning up...");
browser.quit();
}
@Test( priority = 1, description = "Test 1")
public void setUserName(){
Browser.goToPage("http://www.google.com");
Screenshot.page("Goes to google");
}
@Test(priority = 2,description = "Test 2")
public void setPassword(){
Browser.goToPage("http://www.yahoo.com");
Screenshot.page("Goes to yahoo");
}
答案 1 :(得分:0)
我也面临着同样的问题。请在我遵循的解决此问题的流程下面找到:-
请确保代码中提到的驱动程序的路径正确,并且代码中引用的所有浏览器的“ .exe”文件均可用。
现在,如果正确,请下载与您的系统兼容的最新驱动程序版本
->从-https://chromedriver.chromium.org/downloads
下载Chrome驱动程序 下载firefox驱动程序注意-如果您使用的是64位系统,请下载32位版本,否则在IE上进行测试的过程将非常缓慢。
此外,请确保该问题的答案中提到的所有安全级别设置都正确:
Not able to launch IE browser using Selenium2 (Webdriver) with Java
-> MicroSoftWebDriver for Edge与您的OS构建版本兼容。有关更多详细信息,请检查该问题的详细答案(由我本人):-
Java/Selenium: Simple program to open Edge fails (dependency issue?)
执行上述步骤可以解决我的问题