带有phantomjs java的nosuchwindowexception硒

时间:2018-07-10 01:08:21

标签: java selenium selenium-webdriver webdriver phantomjs

我正在使用无头Panthom浏览器来使用phantomjs驱动程序和硒来自动执行应用程序。 (硒Java版本3.5.2和phantomjs.exe)

我有一种情况,我将填写表格并提交,然后浏览器关闭,关闭浏览器后,我将重用驱动程序引用来获取URL。当我在Firefox 2.47.0中使用firefox驱动程序时,它可以很好地工作。

现在,我切换到硒phontamjsdriver和phantombrowser。在这里,当我调用driver.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). 

但是可以与含硒2.4.7的firefoxbrowser一起很好地工作。

2 个答案:

答案 0 :(得分:0)

首先,当您从 Selenium v​​2.47.0 迁移到 Selenium v​​3.5.2 时,值得一提的是,随着硒3.x 。现在 Selenium-WebDriver W3C建议候选人,并且符合WebDriver W3C Editor's Draft


NoSuchWindowException

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

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

现在,有关您的用例,相关的 HTML 和您的代码块的更多详细信息将为我们提供更多思路错误。也许 submitForm(driver) 的定义是解决问题的关键。


最佳做法

这里有一些最佳做法,您可以遵循这些最佳做法来避免 NoSuchWindowException

  • 始终将 Parent Window Handle 放在变量中,以便您可以按照通常的要求遍历回 Parent Window
  • 在调用 driver.switchTo().window(windowHandle); 之前,始终使用 ExpectedConditions 方法numberOfWindowsToBe(int)引发 WebDriverwait
  • 一旦您调用 driver.switchTo().window(windowHandle); 并与 ExpectedConditions 方法titleContains(java.lang.String title)结合使用 WebDriverWait 来等待< em>页面加载完成操作,以在新打开的窗口中继续执行测试步骤
  • 要切换回父窗口,请使用先前存储的 windowhandle
  • 这是一个示例代码块,用于演示 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
    

答案 1 :(得分:0)

这可能是在这里https://github.com/ariya/phantomjs/issues

带到PhantomJS团队的问题

不幸的是,Selenium中的屏幕截图仅捕获DOM,而没有捕获地址栏。如果您可以保存页面源,则可以提取URL。在查看此页面的页面源代码时,我看到列出了各种第三方应用程序的标签,其中有一个列出URL的内容源。

<meta name="twitter:app:url:googleplay" content="http://stackoverflow.com/questions/51255939/nosuchwindowexception-selenium-with-phantomjs-java">

这可能并非对每个站点都适用,但可能需要查找一些地方。如果您是网站所有者,也可以尝试在自己中添加此标签。