硒:在RemoteWebDriver开关选项卡用C#
目前,我正在运行使用硒网格和RemoteWebDriver在Safari上我的Selenium测试。这是我的设置:硒:在RemoteWebDriver开关选项卡用C#
- Mac OS Sierra 10.12.6作为运行测试的机器。
- Selenium服务器3.5.3。
- Safari 11.
- C#Selenium WebDriver和Selenium支持(最新版本)。
我在我的主机操作系统(Windows 10)上使用端口转发将请求转发到运行在我的虚拟机上的Mac。在我的Mac我有硒电网枢纽,它在我奔跑像这样:
java -jar selenium-server-standalone-3.5.3.jar -role hub -port 4723
此外,还有一个节点:
java -jar selenium-server-standalone-3.5.3.jar -role node -hub http://10.0.2.15:4723/grid/register
在代码中,我开始我的司机是这样的:
SafariOprions options = new SafariOptions();
IWebDriver driver = new RemoteWebDriver(new Uri(hubURL), options.ToCapabilities());
我的测试是在当前的设置运行良好。但是当谈到点击一个属性为target='_blank'
的链接时,我开始面临一些麻烦。对于我在本地运行的其他驱动程序,我可以切换选项卡,而不会有任何麻烦:在单击链接之前,我得到了driver.WindowHandles
,然后单击一个链接并再次检索窗口句柄以与以前的句柄进行比较。之后,我使用driver.SwitchTo().Window(newHandle)
,一切都很好。
但是当涉及到RemoteWebDriver(或Apple的SafariDriver,我不能更准确地说)我总是只能获得一个窗口句柄,即使打开新选项卡并且我可以看到它。我试图避免切换选项卡与“Command + T”作为解决方案之一建议,因为我的测试是为了在所有浏览器(铬,火狐,歌剧,边缘,Safari)上运行,这不会工作。
更新:我试过在Selenium Grid中通过RemoteWebDriver运行Chrome和其他浏览器,我可以说这不是RemoteWebDriver的问题。接下来,我已经安装了Visual Studio的Mac和重写几件事情来运行我的测试,而硒电网,只需使用此代码:
//if memory serves, just like this
SafariOptions options = new SafariOptions();
SafariDriver driver = new SafariDriver(options);
但不幸的是,这并没有帮助。司机导航我到页面,点击链接并打开一个新标签,但没有任何开关。当我检查driver.WindowHandles
我只有一个,虽然有两个可见的选项卡。 driver.SwitchTo().ActiveElement
和driver.SwitchTo().Frame(hardcoded_frame_name)
都不起作用。相当长的等待时间(在打开链接之后60秒以及之后的另一个链接)都不起作用。现在我认为这确实是一个错误,我会尽快向苹果公司报告。
但现在,也许有人有这样一个奇特的解决方法吗?
正如我们在评论中讨论,这似乎是一个时间问题。所以我们会诱导 WebDriverWait
与尾随的浏览器实例同步。我通过Selenium-Java
提供代码块作为解决方案,请考虑在C#
中实施它,并在适用于您的情况下更新我。
driver.get("http://www.google.com");
System.out.println("Page Title is : "+driver.getTitle());
String parent_window = driver.getWindowHandle();
((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');");
WebDriverWait wait = new WebDriverWait(driver,3);
wait.until(ExpectedConditions.numberOfWindowsToBe(2));
Set<String> allWindows_1 = driver.getWindowHandles();
ArrayList<String> tabs = new ArrayList<>(allWindows_1);
driver.switchTo().window(tabs.get(1));
wait.until(ExpectedConditions.titleContains("Facebook"));
System.out.println("First Child Handle : "+driver.getTitle());
对不起另一个迟到的回应,但正如我在帖子中说的 - 我已经用等待没有效果。实际上,有很多人等待时间很长(我试过10,30,60秒)。从我的角度来看,这是关于SafariDriver的。或者,如果您的解决方案像Safari + Java的魅力一样工作,那么我认为它与.Net绑定有关,因为它们与Java相比有点过时。 –
可能与Safaridriver的错误太不检测新窗口 –
你能提供一些等待(WebDriverWait),并重新检查? – DebanjanB
@DebanjanB,是的,我提供了几项长期支票,并且徒劳无功。 我已经在网格上检查了RemoteWebDriver与其他浏览器,一切都很好。所以我认为这个问题与我启动Selenium Grid和Safari的方式有关。因为使用nodeconfig.json,我根本没有得到任何句柄。将尝试直接在Mac上运行测试并发布任何更新。 –