У меня ситуация такая, что везде один и тот же тайтл и юрл. Просто у нас фронтэнд на 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 миллиарда операций, которые мог бы выполнить процессор вашего компьютера, но он этого не делает, просто хаотично переключаясь между остальными потоками.
implicitly_wait тут не помогут, копайте в сторону WebDriverWait и selenium.webdriver.support.expected_conditions — Selenium 4.9 documentation
Да sleep это зло, согласен )
Тут более подробно:
В общем делаю так
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)
Я не совсем понял зачем мне выбирать нужную вкладку. Вот как только появились новые вкладки и мой фокус сменился на новую вкладку я тут же хочу перейти на первую, а новые можно и не трогать, а можно и закрыть.
Спасибо за несколько примеров, буду пробовать сейчас.
Фокус сменился у браузера, а у селениума нет. надо явно сказать куда переключить и что закрыть.