我正在使用无头PhantomJS浏览器,使用带硒的PhantomJS驱动程序来自动化应用程序。(seleniumjava 3.5.2版和phantomjs.exe(
我有一个场景,我会填写表格并提交,然后浏览器关闭,关闭浏览器后,我会重用驱动程序引用来获取URL。当我使用带有硒2.47.0的firefox驱动程序时,它工作得很好。
现在我切换到selenium phontamjsdriver和phatombrowser。当我打电话给司机时,在这里。get(url(;在浏览器关闭后,它抛出nosuchwindowexception,表示窗口已关闭或处于非活动状态。但是,同样的代码也适用于firefox驱动程序
示例:
driver.get(url);// first time works
submitForm(driver);//browser window gets closed.
driver.get(url);
最后一行抛出异常为:
nosuchwindowexception(selenium java with 3.5.2 version and phantomjs.exe).
但是使用selenium 2.4.7的firefox浏览器运行良好。
首先,当您从Selenium v2.47.0迁移到Selenium v3.5.2时,值得一提的是,随着硒3.x的可用性,已经发生了很多变化。现在,Seenium WebDriver是W3C推荐候选者,并且符合WebDriver W3C编辑器草案
NoSuchWindowException
NoSuchWindowException
类扩展了NotFoundException
,并且在尝试时主要抛出:
WebDriver.switchTo().window(String windowName);
现在,更多关于用例、相关HTML和代码块的细节会让我们了解更多问题所在。也许submitForm(driver)
的定义是解决问题的关键。
最佳实践
以下是您可以遵循的一些最佳实践,以避免NoSuchWindowException
:
- 始终遍历变量中的父窗口句柄,以便您可以根据一般需要遍历回母窗口
- 在调用
driver.switchTo().window(windowHandle);
之前,请始终将WebDriverwait与ExpectedConditions方法结合使用numberOfWindowsToBe(int)
- 调用
driver.switchTo().window(windowHandle);
后,请将WebDriverWait与ExpectedConditions方法结合使用titleContains(java.lang.String title)
以等待页面加载完成,然后在新打开的窗口上继续执行测试步骤 - 要切换回父窗口,请使用以前存储的窗口句柄
以下是演示Window/Tab处理的示例代码块:
package demo; import java.util.Set; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class WINDOW_HANDLE_ITERATE_Firefox { public static void main(String[] args) throws Exception { System.setProperty("webdriver.gecko.driver", "C:\Utility\BrowserDrivers\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com"); String parent_window = driver.getWindowHandle(); System.out.println("Parent Window Handle is: "+driver.getWindowHandle()); System.out.println("Page Title is: "+driver.getTitle()); ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');"); new WebDriverWait(driver,10).until(ExpectedConditions.numberOfWindowsToBe(2)); Set<String> allWindows_1 = driver.getWindowHandles(); System.out.println("Total Windows: "+allWindows_1.size()); for(String hand1:allWindows_1) if(!parent_window.equals(hand1)) { driver.switchTo().window(hand1); new WebDriverWait(driver,10).until(ExpectedConditions.titleContains("Facebook")); String first_child_window = driver.getWindowHandle(); System.out.println("First Child Window Handle is: "+first_child_window); System.out.println("First Child Window Page Title is: "+driver.getTitle()); driver.close(); } driver.switchTo().window(parent_window); System.out.println("Current Window Handle is : "+driver.getWindowHandle()+ " which is same as "+parent_window +", which is the parent window handle" ); driver.quit(); } }
控制台输出:
1531917836983 geckodriver INFO geckodriver 0.20.1 1531917836993 geckodriver INFO Listening on 127.0.0.1:9993 1531917837915 mozrunner::runner INFO Running command: "C:\Program Files\Mozilla Firefox\firefox.exe" "-marionette" "-profile" "C:\Users\ATECHM~1\AppData\Local\Temp\rust_mozprofile.W5WqVulBNm9x" 1531917842220 Marionette INFO Listening on port 35364 1531917843126 Marionette WARN TLS certificate errors will be ignored for this session Jul 18, 2018 6:14:03 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: W3C Parent Window Handle is: 4294967297 Page Title is: Google Total Windows: 2 First Child Window Handle is: 4294967301 First Child Window Page Title is: Facebook – log in or sign up Current Window Handle is : 4294967297 which is same as 4294967297, which is the parent window handle
这可能是PhantomJS团队面临的问题https://github.com/ariya/phantomjs/issues
不幸的是,Selenium中的屏幕截图只捕获DOM,而没有捕获地址栏。如果您能够保存页面源,则可以提取URL。当查看这个页面的页面源时,我看到了列出各种第三方应用程序的标签,里面有一个列出URL的内容源。
<meta name="twitter:app:url:googleplay" content="http://stackoverflow.com/questions/51255939/nosuchwindowexception-selenium-with-phantomjs-java">
这可能不适用于每个网站,但可能是一个值得关注的地方。如果你是网站所有者,你也可以尝试自己添加这个标签。