RSelenium: переключение Windows с помощью дескриптора окна

Я работаю с RSelenium весь день и все еще натыкаюсь на препятствия то здесь, то там. Моя текущая проблема связана с использованием кода WebElemReports$clickElement(), который щелкает ссылку, и открывается новое окно. Я попытался настроить параметры Firefox в «about:config», чтобы он не открывал новое окно. Он не открывает окно при обычном использовании, но с помощью RSelenium он все еще открывает новое окно. Я также смотрел на этот подход, но не мог понять логику его работы:

Как щелкнутьElement() и открыть ссылку в той же вкладке

Следующей моей мыслью было использовать функцию switchToWindow() вместе с getWindowHandles(). Код, который я написал, выглядит следующим образом:

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

Я думаю, что я закрою текущее окно, чтобы был только один дескриптор для ссылки и передал этот дескриптор функции switchToWindow. Я не могу найти много документации по switchToWindow для R. Я получаю следующую ошибку при использовании приведенного выше кода:

Ошибка: Сводка: UnknownError Сведения: При обработке команды произошла неизвестная ошибка на стороне сервера. класс: org.openqa.selenium.WebDriverException

Любая помощь по этому вопросу будет очень признательна - я попытался изучить это как можно больше, чтобы это не было отмечено как дублирующий вопрос, как мой последний пост. Огромное спасибо.


person d84_n1nj4    schedule 11.08.2016    source источник
comment
Можете ли вы поделиться HTML-кодом этой ссылки? Также попробуйте распечатать переменную windHand и посмотреть, что в ней? Есть ли одно значение или несколько? Проверьте раздел о switchToWindow в конце этой страницы — cran.r-project.org/web/packages/RSelenium/vignettes/   -  person Grasshopper    schedule 11.08.2016
comment
Привет, вывод для windHand выглядит следующим образом, > windHand <- remDr$getWindowHandles(), windHand [[1]], [1] "{ccdc1fb0-d9c8-4bc7-a5d0-b69b1027cf8a}", приношу извинения, но не могу поделиться HTML-кодом.   -  person d84_n1nj4    schedule 11.08.2016
comment
Имеет ли тег ссылки целевой атрибут? Если да, то какая в нем ценность?   -  person Grasshopper    schedule 11.08.2016
comment
Я не верю, что это так - я предполагаю, что это будет в том же месте, что и имена, идентификаторы и классы, верно? У него есть идентификатор, класс, имя, значение, тип и стиль, но я не вижу цели в элементах.   -  person d84_n1nj4    schedule 11.08.2016
comment
Эта ссылка находится внутри каких-либо фреймов или iframe?   -  person Grasshopper    schedule 11.08.2016
comment
Также можете ли вы попробовать использовать код, указанный в ссылке на решение, которую вы упомянули в своем вопросе? Что он делает, так это то, что он находит ссылку и с помощью javascript делает целевой атрибут пустым. Пустое поле должно открыть следующую страницу в том же окне.   -  person Grasshopper    schedule 11.08.2016
comment
Метод switchToWindow требует ввода строки. В этом случае: remDr$switchToWindow(windHand[[1]][1]) будет передавать первый дескриптор окна. В базовой виньетке есть раздел о рамах и окнах http://rpubs.com/johndharrison/12843   -  person jdharrison    schedule 12.08.2016
comment
Спасибо за помощь @Grasshopper. Я думаю, что мне нужно было быть немного более осведомленным в этой области работы, и мы достигли бы тех же результатов.   -  person d84_n1nj4    schedule 12.08.2016
comment
Спасибо за предложение @jdharrison!! Буду иметь в виду этот трюк! Кроме того, хорошая страница в RPubs, я уверен, что буду посещать ее больше!   -  person d84_n1nj4    schedule 12.08.2016


Ответы (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]])
person Saurabh Gaur    schedule 12.08.2016
comment
Большое тебе спасибо!! Сначала я думал, что это не работает, пока не убедился, что нахожусь в правильном дескрипторе окна. Затем я обнаружил, что в дочернем окне, в отличие от родительского окна, есть рамки. Поэтому мне пришлось работать с кадрами. - person d84_n1nj4; 12.08.2016
comment
Это ошибка в версии, которую я сейчас использую. Строка for (window in windows[[1]]) { должна быть for (window in windows) { - person Peter.k; 19.05.2017
comment
@ Peter.k Я изменил код, чтобы удалить первый элемент списка из окон. - person StatsStudent; 26.07.2020