硒:在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().ActiveElementdriver.SwitchTo().Frame(hardcoded_frame_name)都不起作用。相当长的等待时间(在打开链接之后60秒以及之后的另一个链接)都不起作用。现在我认为这确实是一个错误,我会尽快向苹果公司报告。

但现在,也许有人有这样一个奇特的解决方法吗?

+0

可能与Safaridriver的错误太不检测新窗口 –

+0

你能提供一些等待(WebDriverWait),并重新检查? – DebanjanB

+0

@DebanjanB,是的,我提供了几项长期支票,并且徒劳无功。 我已经在网格上检查了RemoteWebDriver与其他浏览器,一切都很好。所以我认为这个问题与我启动Selenium Grid和Safari的方式有关。因为使用nodeconfig.json,我根本没有得到任何句柄。将尝试直接在Mac上运行测试并发布任何更新。 –

正如我们在评论中讨论,这似乎是一个时间问题。所以我们会诱导 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()); 
+0

对不起另一个迟到的回应,但正如我在帖子中说的 - 我已经用等待没有效果。实际上,有很多人等待时间很长(我试过10,30,60秒)。从我的角度来看,这是关于SafariDriver的。或者,如果您的解决方案像Safari + Java的魅力一样工作,那么我认为它与.Net绑定有关,因为它们与Java相比有点过时。 –