【问题标题】:RSelenium: Switching Windows using Window HandleRSelenium:使用窗口句柄切换窗口
【发布时间】:2016-08-11 19:03:52
【问题描述】:

我整天都在使用 RSelenium,但仍然到处遇到障碍。我当前的问题是使用代码WebElemReports$clickElement(),单击链接并打开一个新窗口。我尝试在“about:config”中调整 Firefox 设置,使其不会打开新窗口。它在正常使用时不会打开一个窗口,但使用 RSelenium,它仍然会打开一个新窗口。我也研究了这种方法,但无法理解其工作原理:

How to clickElement() and open the link in the same tab

我的下一个想法是使用 switchToWindow() 函数和 getWindowHandles()。我写的代码如下:

remDr$closeWindow()
windHand <- remDr$getWindowHandles()
remDr$switchToWindow(windHand)

我的想法是我将关闭当前窗口,以便只有一个句柄可供引用并将该句柄传递给 switchToWindow 函数。我找不到太多 R 的 switchToWindow 文档。使用上面的代码时我收到以下错误:

错误:摘要:UnknownError 详细信息:处理命令时发生未知的服务器端错误。 类:org.openqa.selenium.WebDriverException

对此的任何帮助将不胜感激 - 我尝试尽可能多地研究这个问题,这样它就不会像我上一篇文章那样被标记为重复的问题。非常感谢。

【问题讨论】:

  • 你能分享这个链接的HTML代码吗?也尝试打印出 windHand 变量,看看里面有什么?是否存在一个或多个值?检查本页末尾的 switchToWindow 部分 - cran.r-project.org/web/packages/RSelenium/vignettes/…
  • 您好,windHand 的输出如下,&gt; windHand &lt;- remDr$getWindowHandles()windHand [[1]][1] "{ccdc1fb0-d9c8-4bc7-a5d0-b69b1027cf8a}",抱歉,我不能分享 HTML。
  • 链接标签是否有目标属性?如果是的话,它的价值是什么?
  • 我不相信它——我假设它与名称、ID 和类位于同一位置,对吗?它有一个 id、类、名称、值、类型和样式,但我在 Elements 下看不到目标。
  • 此链接是否在任何框架或 iframe 中?

标签: r selenium web-scraping rselenium window-handles


【解决方案1】:

其实你不能关闭主窗口,你可以切换到子窗口如下:-

# get main window and store to switch back
currWindow <-  remDr$getCurrentWindowHandle()

#gel all windows 
windows <- remDr$getWindowHandles()

#loop through switching child window 
for (window in windows[[1]]) {
  if (window != currWindow[[1]]) 
    remDr$switchToWindow(window)
}

#now do your stuff with child window 

#now close your child window after doing all stuff
remDr$closeWindow()

#now switch back to main window for further stuff 
remDr$switchToWindow(currWindow[[1]])

【讨论】:

  • 非常感谢!!起初我认为它不起作用,直到我确认我在正确的窗口句柄中。然后我发现子窗口与父窗口不同,有框架。所以我不得不通过框架。
  • 我目前使用的版本有问题。 for (window in windows[[1]]) { 应该是 for (window in windows) {
  • @Peter.k 我修改了代码以从 windows 中删除第一个列表元素。