Как перемещаться по вкладкам при помощи python и seleniumWD?

У меня ситуация такая, что везде один и тот же тайтл и юрл. Просто у нас фронтэнд на Ext JS и там все делается внутри на одной странице.

Ничего что я в псевдокоде писал? Это алгоритм, а не реализация. И вейты это зло. Есть несколько разных способов их избежать.

qukobrist
Всегда есть что-то, за что можно зацепиться. Если это динамический JS, то можно ждать появления какого-то элемента на странице. Хотя зачем нужны две табы, чтобы изображать одну страничку - для меня загадка, но в целом у вас есть механизм переключения по табам/окнам описаный выше.

“И вейты это зло. Есть несколько разных способов их избежать.”
О, это интересно. Как можно избежать ожиданий?

Читая мануалы, самый верный

Это не ответ. У меня в мануалах написано, что без ожиданий совсем никак не обойтись. Интересно что у вас написано?

А я вобще ниче не знаю, из села я. Пишу че ни попаде где ни попаде. Бабка говорила, чтоба успяшным быть, галдеть надобно много. Так вот и галжу, ничяго не соображая в событиях браузера, ос, explicit и implicit waits, и навоз разбрасываю наподобии:

Я не в силах это распарсить. Мы вообще о чем говорим?
“И вейты это зло. Есть несколько разных способов их избежать.”
Как можно избежать вейтов, если твой код запускается на одной стороне, а приложение на другой?

ну ситуация такая - я нажал на кнопку “Купить” и тут же у меня открылся документ платежка.pdf в отдельной вкладке и я переместился в отдельную вкладку. Мне нужно теперь вернуться опять на ту же вкладку где и кнопка

Метод ysparrow.
Запишите хендл основного окна в переменную до выполнения цикла. После цикла просто switchTo.window(old_handle)

я знаю. что делаю не правильно, но я использую time.sleep(секунды). Просто потмоу, что не понимаю, какие задержки делают driver.implicitly_wait(секунды). У меня часто бывает, что не добирает символы в поле ввода или быстро перескакивает поле. Короче слипы лучше всего работают.

Я запомнил current_hendle

b = self.driver.current_window_handle
        print(b)

Я запомнил все hendle открытые

s = self.driver.window_handles
        print(s)

Получилось

CDwindow-a7997c10-0029-4cdd-b0c6-dc418b4354f4

И все 3

['CDwindow-a7997c10-0029-4cdd-b0c6-dc418b4354f4', 'CDwindow-f040580f-cc87-4136-a056-e3c6bb8076c9', 'CDwindow-073295d9-c553-48f9-8f67-18ee6212dda0']

Если я указываю каррентхэндл, то переключаюсь в него

driver.switch_to.window(CDwindow-a7997c10-0029-4cdd-b0c6-dc418b4354f4)

Выдает ошибку. Как мне переместиться на нужную мне вкладку?

‘CDwindow-a7997c10-0029-4cdd-b0c6-dc418b4354f4’ со скобками

Я здесь вынужден извиниться перед sparrow, так как работаю с кодом где wait == sleep, и под конец дня мой мозг вейты приравнял к слипам. Слипы зло, Слипы! waitFor - это гут.

Вот благодаря последнему комменту от qukobrist смог переключить разницу у себя в мозгу.

qukobrist:
Не надо слип. Есть более правильные способы:

http://www.seleniumeasy.com/selenium-tutorials/webdriver-event-listener-example

Представьте, что каждая сеекунда слипа, это 3 миллиарда операций, которые мог бы выполнить процессор вашего компьютера, но он этого не делает, просто хаотично переключаясь между остальными потоками.

3 лайка

implicitly_wait тут не помогут, копайте в сторону WebDriverWait и selenium.webdriver.support.expected_conditions — Selenium 4.9 documentation

1 лайк

Да sleep это зло, согласен )

Тут более подробно:

1 лайк

В общем делаю так

s = self.driver.window_handles
print(s)
b = self.driver.current_window_handle
print(b)
time.sleep(10)
self.driver.switch_to.window(b)

Но меня не перекидывает на первую вкладку(

А где код выбора нужной вкладки?

Смотри код, который arturk писал, как вариант:

b = self.driver.current_window_handle

for handle in driver.window_handles:
    if  driver.switch_to.window(handle).current_window_handle != b
       .....
      driver.close()

self.driver.switch_to.window(b)

вот еще вариант:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

#....
#....

wait = WebDriverWait(driver, 10)

current_window = driver.current_window_handle
old_windows = driver.window_handles

#open new window here...
#.....

wait.until(ec.new_window_is_opened(old_windows))
new_window = [i for i in driver.window_handles if i not in old_windows]
driver.switch_to.window(new_window[0])

#do something in new window
#....

driver.close()
driver.switch_to.window(current_window)
2 лайка

Я не совсем понял зачем мне выбирать нужную вкладку. Вот как только появились новые вкладки и мой фокус сменился на новую вкладку я тут же хочу перейти на первую, а новые можно и не трогать, а можно и закрыть.

Спасибо за несколько примеров, буду пробовать сейчас.

Фокус сменился у браузера, а у селениума нет. надо явно сказать куда переключить и что закрыть.