我正在使用无头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一起很好地工作。
答案 0 :(得分:0)
首先,当您从 Selenium v2.47.0 迁移到 Selenium v3.5.2 时,值得一提的是,随着硒3.x 。现在 Selenium-WebDriver 是 W3C建议候选人,并且符合WebDriver W3C Editor's Draft
NoSuchWindowException
类扩展了NotFoundException
,并在尝试时主要被抛出:
WebDriver.switchTo().window(String windowName);
现在,有关您的用例,相关的 HTML 和您的代码块的更多详细信息将为我们提供更多思路错误。也许 submitForm(driver)
的定义是解决问题的关键。
这里有一些最佳做法,您可以遵循这些最佳做法来避免 NoSuchWindowException
:
driver.switchTo().window(windowHandle);
之前,始终使用 ExpectedConditions 方法numberOfWindowsToBe(int)
引发 WebDriverwait 。driver.switchTo().window(windowHandle);
并与 ExpectedConditions 方法titleContains(java.lang.String title)
结合使用 WebDriverWait 来等待< em>页面加载完成操作,以在新打开的窗口中继续执行测试步骤。这是一个示例代码块,用于演示 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">
这可能并非对每个站点都适用,但可能需要查找一些地方。如果您是网站所有者,也可以尝试在自己中添加此标签。