nosuchwindowexception Selenium with PhantomJS Java



我正在使用无头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 WebDriverW3C推荐候选者,并且符合WebDriver W3C编辑器草案


NoSuchWindowException

NoSuchWindowException类扩展了NotFoundException,并且在尝试时主要抛出:

WebDriver.switchTo().window(String windowName);

现在,更多关于用例、相关HTML代码块的细节会让我们了解更多问题所在。也许submitForm(driver)的定义是解决问题的关键。


最佳实践

以下是您可以遵循的一些最佳实践,以避免NoSuchWindowException

  • 始终遍历变量中的父窗口句柄,以便您可以根据一般需要遍历回母窗口
  • 在调用driver.switchTo().window(windowHandle);之前,请始终将WebDriverwaitExpectedConditions方法结合使用numberOfWindowsToBe(int)
  • 调用driver.switchTo().window(windowHandle);后,请将WebDriverWaitExpectedConditions方法结合使用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">

这可能不适用于每个网站,但可能是一个值得关注的地方。如果你是网站所有者,你也可以尝试自己添加这个标签。

相关内容

  • 没有找到相关文章

最新更新