Як перейти на іншу вкладку Селеніум




Як перейти на іншу вкладку Селеніум



Як перемикати вкладки в браузері з допомогою Selenium Python?

Автоматизація Selenium значно полегшила життя тестувальникам автоматизації, особливо в таких випадках, як автоматизація вкладок Python Selenium switch. У цьому блозі ми заглибимося у те, як виконати Selenium switch…

Selenium automation пропонує вправні способи найбільш ефективного виконання повсякденних завдань. Від захоплення скріншотів до тестування PDF-файлів немає межі того, що ви можете зробити за допомогою Selenium automation. Розробники та тестувальники-майстри буріння сайтів та пошуку лазівок. Найчастіше ця вправа включає перемикання вкладок кілька разів на день. Щоб зменшити ручні зусилля, ми рекомендуємо використовувати Python Selenium для перемикання вкладок.

У цій статті ми допоможемо вам освоїти кілька способів перемикання вкладок Selenium за допомогою Python.

Коли Нам Потрібно Відкривати Або Перемикати Вкладки У Selenium Automation?

Відкриття нової вкладки або перемикання між декількома вкладками – одна з найголовніших функцій, що виконуються всіма нами щодня. Давайте розглянемо деякі сценарії, коли відкриття або перемикання вкладок стане в нагоді під час автоматизації Selenium.

App Suits – Тестування Функцій, які можуть працювати паралельно

Найбільш очевидний сценарій-це коли ваша програма занадто велика і в ньому є міні-додатки. Наприклад, якщо ви використовували Linkedin, ви могли зіткнутися з “Навчанням Linkedin” та “Навігатором продажу Linkedin” як два підпрограми. Аналогічно, багато інших додатків складаються з кількох інших дрібніших складових додатків. Наприклад, G-suite, Youtube (media player & creator studio), Hubspot, Azure та Amazon тощо. Д., Деякі з них за замовчуванням відкриваються на новій вкладці. Для інших має сенс навмисно відкрити новий додаток на новій вкладці. Ось тут і вступає у справу тестування автоматизації Selenium.

Тестування Функцій програми для електронної комерції

Давайте розглянемо ще один приклад тестування програм електронної комерції. Припустимо, ви тестуєте веб-сайт електронної комерції та хочете додати товар у кошик. Потім ви хочете перевірити, чи це відображається на сторінці кошика. Потім ви хочете додати ще один товар у кошик. А потім ви хочете підтвердити, чи видно він у кошику. Виконання цього в тому ж вікні браузера і на тій же вкладці може бути трудомістким завданням, і саме тут з'являється автоматизація Selenium.

Тестування функціональності завантаження мультимедіа

Іншим поширеним прикладом може бути паралельне завантаження кількох відео на платформу для ведення блогів, як Vimeo або Youtube. Це ідеальний випадок для тестування з кількома браузерами та крос-вкладками.

Коротше кажучи, тестування автоматизації включає перемикання вкладок у наступних сценаріях –

  • Тестування паралельних функцій великих додатків, наприклад, Zoho, G-suite, Office365 тощо.
  • Тестування посилань, що автоматично відкриваються на новій вкладці. Наприклад, програми для електронної комерції
  • Паралельне тестування незалежних програм, якщо в цьому виникне потреба.

У цьому уроці з перемикання вкладок Python Selenium ми зосередимося на відкритті та перемиканні між вкладками за допомогою Python & Selenium. Ми маємо спеціальні статті для операцій тестування на сторінці, таких як обробка попереджень, перетягування об'єктів за допомогою миші або створення повносторінкових скріншотів. Можливо, ви захочете звернутися до них, щоб глибше поринути у приклади використання Selenium automation.

Як створити Нову вкладку У Selenium Python?

Щоб розпочати роботу з Python Selenium switch tabs automation, ваша система має бути оснащена необхідними інструментами. Ось всі передумови:

  • У вашій системі встановлені останні прив'язки Selenium-Python, Python3, pip, virtualenv
  • У вас також є шлях до веб-драйвера, що виконується з вибору вашого браузера у вашій системі.

Якщо ні, ви можете просто дотримуватися інструкцій, наведених у цьому Selenium 4 з Python blog, щоб почати роботу з Python Selenium switch tab automation. Ми можемо відкривати нові вкладки у Selenium-Python, виконуючи JavaScript, а також використовуючи клас ActionChains Selenium.

Погляньмо, як це можна зробити.

Відкрийте Нові вкладки У Selenium Виконавши JavaScript

У наступному коді замініть “chrome_webdriver_executable_path” шляхом до файлу chrome, що виконується. В ідеалі ви повинні додати його в змінну системного ШЛЯХУ.

від selenium import webdriver import time driver = webdriver.Chrome(chrome_webdriver_executable_path) driver.maximize_window() driver.get("https://www.cntraveller.in/") # Назад до нового tab за допомогою javascript and loadgoogle. driver.execute_script('''window.open("https://www.google.com", "_blank");''') time.sleep(5) driver.quit()

execute_script – це метод, який надається Selenium для виконання фрагментів JavaScript у віддалено керованому браузері. Його можна використовувати для прокручування веб-сторінки, відкриття нового вікна, запуску оповіщення та багато іншого. window.open – це метод DOM для запуску нових вкладок. Він приймає URL, ім'я, специфікації та замінює їх як параметри. Для нашого варіанту використання Selenium automation testing нас цікавить лише URL-адреса та ім'я. Ви можете використовувати специфікації для запуску нових вкладок різних розмірів та конфігурацій.

У “Прикладі коду 1”, якщо ви хочете відкрити порожню вкладку у Selenium Python, замініть рядок після коментаря наступним кодом –

driver.execute_script('''window.open("", "_blank");''')

Або інший еквівалент був би -

driver.execute_script('''window.open();''')

Оскільки “_blank” є значенням для необов'язкового параметра “name”."_parent", "_self", "_top" - це деякі інші значення, які можуть знадобитися для відкриття "url" у батьківському кадрі, тому ж вікні або верхньому кадрі відповідно.

Відкрийте Нові вкладки У Selenium, Виконавши Клас ActionChains

Другий спосіб запуску нової вкладки в Selenium-використовувати метод key_up і key_down класу ActionChains Selenium та клацнути по HTML-елементу з посиланням.

від selenium import webdriver від selenium.webdriver.common.action_chains import ActionChains import time from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome(chrome_webdriver_executable_path) driver.get('https ) time.sleep(5) # locates a link element on the loaded url using xpath new_tab_link = driver.find_element_by_xpath('//a[contains(@class,"nav-link") and contains(@href,"selenium-automation" )]') time.sleep(5) # instantiates ActionChains class of selenium webDriver action = ActionChains(driver) # clicks on located kink element with CONTROL button in pressed state using actionChains class. Цей ключ до нового tab action.key_down(Keys.CONTROL).click(new_tab_link).key_up(Keys.CONTROL).perform() time.sleep(3) driver.quit()

Клас ActionChains selenium grid забезпечує низькорівневу взаємодію з елементами веб-програми. Тестувальники Selenium automation часто використовують його для переміщення курсору миші, подвійного клацання по HTML-елементу, операцій перетягування і, звичайно, для натискання клавіш клавіатури. Метод ланцюжків дій Key_down імітує натискання клавіші, переданої як параметр. Метод Key_up звільняє клавішу. Знову ж таки, ключ передається як параметр методу key_up.

Відкрийте Нові вкладки У Selenium, Виконавши send_keys

Інший спосіб відкрити нові вкладки в Selenium це використовувати send_keys для елемента “тіло”. Це синтаксис, що використовується

driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')

Примітка: Ви знайдете безліч рішень в Інтернеті, які стверджують: "Це ідентично спільному натисканню клавіш Ctrl і" t "в браузерах, керованих користувачем". або “Цей метод запускає нову вкладку для елемента у фокусі”. Якщо вам потрібно відкрити посилання на новій вкладці, отримайте розташування елемента за допомогою селекторів XPath або CSS і вкладіть операцію send_keys за допомогою клавіш .УПРАВЛІННЯ + ‘t’ як параметри. Але, на жаль, це не працює. Ми перевірили останню версію Selenium&Python на дату публікації цієї статті.

Як перемикати вкладки Selenium Python?

Перемикання вкладок у selenium python не так вже й громіздко. Ми можемо використовувати current_window_handle & window_handles метод Selenium WebDriver для автоматизації перемикання вкладок у сітці Selenium за допомогою Python. Крім того, ми також можемо використовувати клас ActionChains для перемикання вкладок у дистанційно керованому кросбраузерному тестуванні автоматизації.

Перемикайте вкладки В Selenium Python, виконуючи switch_to_window, switch_to.window, current_window_handle та window_handles

У цьому підручнику Selenium Python switch tab ми можемо розпочати роботу за допомогою кількох методів, включаючи switch_to_window, switch_to.window, current_window_handle & window_handles . Перш ніж ми перейдемо до виконання, ви повинні зазначити, що метод switch_to_window тепер застарів, а метод switch_to.window замінив його.

import unittest from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time from selenium.webdriver.common.keys import Keys class SwitchTab(unittest.TestCase): def setUp(self) () self.driver = webdriver.Chrome(chrome webdriver executable location) def test_switch_tab(self): driver = self.driver driver.maximize_window() driver.get('https://www.lambdatest.com/') time.sleep( 5) # collects handle ID of current window first_tab_handle = driver.current_window_handle print("first_tab_handle : "+str(first_tab_handle)) # locates a link element on the loaded url using xpath new_tab_link = driver.find_element_by_xpath('//a[contains(@class," contains(@href,"selenium-automation")]') time.sleep(5) action = ActionChains(driver) # клацніть на місцевому повідомленні елемента з кнопкою CONTROL в кнопці, натиснутому за допомогою функцій Chains class. Це з'являється посилання на новий tab. action.key_down(Keys.CONTROL).click(new_tab_link).key_up(Keys.CONTROL).perform() time.sleep(3) print("driver.window_handles : " + str(driver.window_handles)) print("current window handle : "+ str(driver.current_window_handle)) if driver.current_window_handle == first_tab_handle: print("driver focus is not switched to new tab opened using actionChains.") else: print("window handle has changed. Driver switched focus to new tab.") driver.switch_to.window(driver.window_handles[1]) time.sleep(3) # stores handle of tab Opened using actionchains if driver.current_window_handle != first_tab_handle: ctrl_click_tab = driver.currentNew tab's handle id is - ") print(ctrl_click_tab) else: print("driver focus is not shifted to new tab.") time.sleep(5) driver.execute_script('''window.open("", "_blank ");''') time.sleep(5) print("driver.window_handles : " + str(driver.window_handles)) try: if (driver.current_window_handle == first_tab_handle) або (driver.current_window_handle == ctrl_click_tab): print("Though ac as it's highlighted but driver control still remains with the tab we last switched to.") except: pass time.sleep(3) for handle in driver.window_handles: if (handle == first_tab_handle) or (handle == ctrl_print_ handle) else: js_tab_handle = handle print("js tab handle is -") print(js_tab_handle) driver.switch_to.window(js_tab_handle) time.sleep(5) break if driver.current_window_handle == js_tab_handle: print("driver focus id -") print(driver.current_window_handle) driver.get('https://www.lambdatest.com/blog/') # shifts control or focus to the first window in window handles, it's not last opened tab but 1st tab in order. driver.switch_to_window(driver.window_handles[1]) time.sleep(5) driver.get('https://www.lambdatest.com/pricing') driver.switch_to.window(driver.window_handles[-1]) time .sleep(5) driver.get('https://www.lambdatest.com/newsletter/') time.sleep(3) driver.switch_to.window(first_tab_handle) if driver.current_window_handle == first_tab_handle: print("current_window_handle : " driver.current_window_handle)) print("driver switched to first tab") else: print("driver switching failed") time.sleep(5) def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main ()

Давайте розберемо код для більшої ясності Selenium Python switch tab automation. Ось і все-

import unittest from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time from selenium.webdriver.common.keys import Keys

Тут ми спочатку імпортуємо усі необхідні залежні бібліотеки. Модуль Python unittest для написання тестових випадків на Python. Модуль WebDriver з python-selenium бібліотеки для автоматизації дій браузера. І клас ActionChains від Selenium WebDriver – для автоматизації низькорівневих взаємодій із використанням переривань миші та клавіатури. Модуль часу Python для неявного або явного припинення виконання чи очікування. Нарешті модуль Keys від Selenium WebDriver для імітації введення кнопок клавіатури.

def setUp(self): # self.driver = webdriver.Firefox() self.driver = webdriver.Chrome()

Це робиться для налаштування середовища тестування браузера. Якщо ви використовуєте платформу тестування хмарної автоматизації, таку як Lambda Test, для цього також в ідеалі необхідно налаштувати параметри цієї функції. Тут ми використовуємо Chrome як браузер, але ви можете використовувати будь-який браузер. Сценарій працює так само і з Firefox або Edge.

def test_switch_tab(self): driver = self.driver driver.maximize_window()

Далі ми визначаємо функцію “test_switch_tab”. В ідеалі, якщо ви використовуєте бібліотеку модульних тестів, запустіть цю функцію під назвою ” test “. driver.maximize_window запускає екземпляр Chrome у повноекранному режимі.

driver.get('https://www.lambdatest.com/') time.sleep(5)

Перший рядок завантажує домашню сторінку тесту Lamda у нашому нещодавно запущеному екземплярі Chrome. time.sleep(сек) зупиняє виконання наступних рядків програми на вказані секунди.

first_tab_handle = driver.current_window_handle print("first_tab_handle : "+str(first_tab_handle))

Ми використовуємо метод current_window_handle драйвера, щоб отримати та зберегти ідентифікатор дескриптора для активної вкладки у змінній з ім'ям first_tab_handle .

new_tab_link = driver.find_element_by_xpath('//a[contains(@class,"nav-link") and contains(@href,"selenium-automation")]')

На домашній сторінці LamdaTest ми знаходимо посилання на сторінку selenium-automation з XPath.

action = ActionChains(driver) action.key_down(Keys.CONTROL).click(new_tab_link).key_up(Keys.CONTROL).perform()

Потім ми створюємо ланцюжки дій та виконуємо операції key_down, click та keep_up, щоб відкрити веб-сторінку selenium-automation Лямбда-тесту на новій вкладці. Ми пропустимо пояснення наступних кількох самоочевидних рядків коду, які демонструють, що керування драйвером залишається на першій вкладці , запросивши метод драйвера current_window_handle.

driver.switch_to.window(driver.window_handles[1]) ctrl_click_tab = driver.current_window_handle

Тут ми використовуємо метод switch_to.window і передаємо йому ідентифікатор дескриптора нової вкладки, запущеної з використанням класу ActionChains як аргумент. Це переключило керування драйвером на вкладку з веб-сторінкою selenium-automation LamdaTest.

driver.execute_script('''window.open("", "_blank");''')

Цей рядок запускає нову вкладку. Він дійсно підсвічується, але елемент управління, як і раніше, знаходиться на вкладці selenium-automation.

for handle in driver.window_handles: if (handle == first_tab_handle) або (handle == ctrl_click_tab): print(handle) else: js_tab_handle = handle

Наведені вище рядки логічно витягують ідентифікатор дескриптора для нової вкладки JS та зберігають його в js_tab_handle.

driver.switch_to.window(js_tab_handle)

Цей рядок перемикається на останню вкладку.

driver.switch_to_window(driver.window_handles[1]) driver.switch_to.window(driver.window_handles[-1])

Ми також можемо перемикатися між вкладками за допомогою window_handles indexes, негативні індекси відраховуються у зворотному порядку від останньої вкладки.

Але це хороша ідея-зберігати ідентифікатори в змінних і перемикати вкладки за допомогою змінних, як показано в наведеному нижче рядку коду.

driver.switch_to.window(first_tab_handle)

Ця функція автоматично викликається після виконання тестового набору та закриття драйвера.

def tearDown(self): self.driver.quit()

При успішному виконанні наведеного вище скрипту ви побачите наступний висновок –

Як перемикатися між кадрами в Selenium Python?

Перемикання між кадрами аналогічне перемиканню між вкладками. Різниця полягає у синтаксисі. Тут ми маємо використовувати switch_to.frame()

Ми можемо перемикатися між кадрами, знаходячи елемент за допомогою селекторів XPath або CSS, а також перемикатися за допомогою iFrame.

Щоб повернути керування драйвером до стандартного вмісту, використовуйте switch_to.default_content()

Перемикання Вкладок З Допомога Selenium Automation У Хмарі Лямбда – Тестів

Використання хмарної платформи – найкращий спосіб використовувати автоматизацію Selenium та легко отримувати бажані результати. Ви можете виконати автоматизацію вкладок перемикання Python Selenium у cloud Selenium Grid LamdaTest, щоб максимально використовувати її.

Для цього ви можете отримати значення для імені користувача, маркера доступу та gridUrl під час реєстрації в лямбда-тесті. Ви можете зареєструватись тут безкоштовно. Як тільки у вас буде необхідна інформація, вам потрібно буде оголосити бажані можливості вашого тестування середовища. Генератор лямбда-тестів DesiredCapabilities надасть вам можливості, засновані на вашому виборі ОС, браузера та його версії, роздільній здатності.

def setUp(self): username = "YOUR_LAMBDATEST_USERNAME" accessToken = "YOUR_LAMBDATEST_ACCESS_TOKEN" gridUrl = "hub.lambdatest.com/wd/hub" desired_cap = < 'platform' : "win10", 'browser ': "67.0", "resolution": "1024x768", "name": "LambdaTest selenium automation switch tabs using python", "build": "LambdaTest selenium python switch tabs", "network": True, "video": "visual": True, "console": True, >url = "https://"+username+":"+accessToken+"@"+gridUrl print("Initiating remote driver on platform:" +" version: "+desired_cap["version"]) self.driver = webdriver.Remote( desired_capabilities=desired_cap, command_executor= url ) # self.driver = webdriver.Firefox() # self.driver = webdriver.Chrome()

Це єдина функція, яку необхідно змінити під час виконання вашого скрипту у хмарній сітці селену LamdaTest.

Висновок

Інженери з тестування хмарної автоматизації отримують гнучкість і гнучкість, щоб безперешкодно використовувати свої функціональні, приймальні, білі, чорні та регресійні тести у цільових веб- та мобільних додатках. Коли вони роблять все це, перемикання між вкладками може зайняти багато часу. Якщо ви хочете підняти свої навички автоматизації на новий рівень, почніть автоматизацію з Python Selenium switch tab automation та заощадіть багато зусиль вручну.

Крім того, ми рекомендуємо використовувати хмарну платформу Lambda Test, яка проста та економічна. З більш ніж 2000 операційними системами та браузерами, які ви можете запропонувати, ви так багато можете зробити з автоматизацією лямбда-тестів.

Читайте ще за темою:

Як перейти на активну вкладку Selenium?

Ми розробили розширення для Chrome, і я хочу протестувати наше розширення за допомогою Selenium. Я створив тест, але проблема в тому, що наше розширення відкриває нову вкладку під час його встановлення, і я думаю, що отримую виняток з іншої вкладки.Чи можна переключитися на активну вкладку, яку я тестую?

def login_to_webapp(self): self.driver.get(url='http://example.com/logout') self.driver.maximize_window() self.assertEqual(first="Web Editor", second=self.driver. title) action = webdriver.ActionChains(driver=self.driver) action.move_to_element(to_element=self.driver.find_element_by_xpath(xpath="//div[@id='header_floater']/div[@class='header_menu']/button[@class='btn_header signature_menu'][text( )='My signature']")) action.perform() self.driver.find_element_by_xpath(xpath="//ul[@id='signature_menu_downlist'][@class='menu_downlist']/li[text()='Log In']").click() self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/div[@class='input']/input[@name='useremail']").send_keys("[email ]") self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/div[@class='input']/input[@name='password']").send_keys("[password ]") self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/button[@type='submit'][@class='atho-button signin_button'][text()='Sign in']").click()

Тест не проходить за допомогою ElementNotVisibleException: Message: element not visible , тому що в новій вкладці (відкритій розширення) не видно "Вхід" (я думаю, що нова вкладка відкривається тільки після команди self.driver.get(url='http:/ /example.com/logout')).

Оновлення: Я виявив, що виняток не пов'язаний з додатковою вкладкою, вона знаходиться з нашого веб-сайту.

def close_last_tab(self): if (len(self.driver.window_handles) == 2): self.driver.switch_to.window(window_name=self.driver.window_handles[-1]) self.driver.close() self.driver.switch_to.window(window_name=self.driver.window_handles[0])

Після закриття додаткової вкладки я можу побачити свою вкладку у відео.

10 відповідей

Це насправді спрацювало для мене у 3.x:

driver.switch_to.window(driver.window_handles[1])

Ручкарі вікна додані, тому вибирається друга вкладка у списку

щоб продовжити з першою вкладкою:

driver.switch_to.window(driver.window_handles[0])

Деякі можливі підходи:

1 - Перемикання між вкладками за допомогою send_keys (CONTROL + TAB)

self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)

2 - Переключення між вкладками за допомогою ActionsChains (CONTROL+TAB)

actions = ActionChains(self.driver) actions.key_down(Keys.CONTROL).key_down(Keys.TAB).key_up(Keys.TAB).key_up(Keys.CONTROL).perform()

3 - Інший підхід може використовувати методи Selenium для перевірки поточного вікна та переходу до іншого:

Ви можете використовувати

driver.window_handles

для пошуку списку маркерів вікна та після спроби перемикання за допомогою наступних методів.

- driver.switch_to.active_element - driver.switch_to.default_content - driver.switch_to.window

Наприклад, щоб перейти на останню відкриту вкладку, ви можете зробити таке:

driver.switch_to.window(driver.window_handles[-1])

Прийнята відповідь, на жаль, не спрацювала для мене.
Щоб відкрити нову вкладку та перейти на неї за допомогою Selenium, я використав:

driver.execute_script('''window.open("https://some.site/", "_blank");''') sleep(1) # Ви можете також зробити без того, щоб грати добре driver.switch_to. window(driver.window_handles[-1]) # last opened tab handle # driver.switch_to_window(driver.window_handles[-1]) # for older versions

якщо вам потрібно повернутися до основної вкладки, використовуйте:

driver.switch_to.window(driver.window_handles[0])

window_handles містить список handles відкритих tabs , використовуйте його як аргумент у switch_to.window() для перемикання між вкладками.

Натискання ctrl + t або вибір window_handles[0] передбачає, що у вас відкрито лише одну вкладку під час запуску.

Якщо у вас відкрито кілька вкладок, це може стати ненадійним.

old_tabs=self.driver.window_handles #Perform action that opens new window here new_tabs=self.driver.window_handles for tab in new_tabs: if tab in old tabs: pass else: new_tab=tab driver.switch_to

Це щось позитивно ідентифікує нову вкладку перед переходом на неї та встановлює активне вікно на потрібну нову вкладку.

Просто вказівка ​​браузеру відправити ctrl + tab не працює, тому що не каже веб-драйверу перейти на нову вкладку.

Якщо ви хочете закрити тільки активну вкладку і потрібно зберегти вікно браузера відкритим, ви можете використовувати метод switch_to.window, який має вхідний параметр як handle-id вікна.

від selenium import webdriver import time driver = webdriver.Firefox() driver.get('https://www.google.com') driver.execute_script("window.open('');") time.sleep(5) driver.switch_to.window(driver.window_handles[1]) driver.get("https://facebook.com") time.sleep(5) driver.close() time.sleep(5) driver.switch_to.window(driver.window_handles[0]) driver.get("https ://www.yahoo.com") time.sleep(5) #driver.close()

Порада від користувача "aberna" спрацювала для мене так:

Спочатку я отримав список вкладок:

tab_list = driver.window_handles

Потім я вибрав вкладку:

driver.switch_to.window(test[1])

Повертаючись до попередньої вкладки:

driver.switch_to.window(test[0])

Якщо вам раптом знадобиться рішення на Java, ось вам шлях:

driver.switchTo().window((String) driver.getWindowHandles().toArray()[index of tab]);

Коротко: є обхідне рішення з деякими обмеженнями.

Я працюю з вже відкритим браузером, як показано тут.

Натискання на посилання, яке відкривається в новому вікні, фокусуватиме нове вікно або вкладку на екрані, але WebDriver не знатиме, яке вікно операційна система вважає активним.

Мені це звучить дуже дивно. Тому що не перше завдання selenium обробляти та автоматизувати взаємодію з браузером? Більше того, перемикання на будь-яку вкладку з driver.switch_to.window(. ) фактично перемкне активну вкладку у gui. Здається, це помилка. На момент написання версії python-selenium – 4.1.0.

Давайте подивимося, які ми можемо використовувати підходи.

Використання підходу selenium window_handles[0]

Підхід із вищенаведеної відповіді не є надійним. Він не завжди працює. Наприклад, при перемиканні між різними вкладками, chromium/vivaldi може почати повертати не поточну вкладку.

print("Current driver tab:", driver.title) #    

Тож пропустіть цей метод.

Використання підходу віддаленого налагодження

Надає нічого додаткового до того, що знаходиться в драйвері selenium з попереднього підходу.

Отримання списку вкладок за допомогою протоколу віддаленого налагодження, наприклад

r = requests.get("http://127.0.0.1:9222/json") j = r.json() цей випадок, тому що це є background-page, він відповідає одному з налагоджених extensions found_tab = el break if not found_tab: print("Could not find tab", file=sys.stderr) real_opened_tab_handle = "CDwindow-" + found_tab["id"] driver.switch_to(real_opened_tab_handle)

насправді повертає те ж саме, що й у driver.window_handles.. Тому також пропустіть цей метод.

Рішення для обходу X11

від wmctrl import Window all_x11_windows = Window.list() chromium_windows = [ chromium windows") exit(1) real_active_tab_name = chromium_windows[0].wm_name.rstrip(" – Chromium") chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", 2. https://stackoverflow.com/a/70088095/7869636 - Selenium connect to existing browser. # Потрібно запустити chromium as: chromium --remote-debugging-port=9222 driver = webdriver.Chrome(service=Service(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install()), options=chrome_options) tabs = found_active_tab = False for tab in tabs: driver.switch_to.window(tab) if driver.title != real_active_tab_name: continue else: found_active_tab = True break if not found_active_tab: print("Cannot switch to needed tab, some ) else: print("Додаткові перемикання до Open tab") print("Working with tab called:", driver.title)

Ідея полягає в отриманні заголовка вікна wmctrl, який дозволить вам дізнатися ім'я активної вкладки.

Рішення для обходу для Wayland

Попереднє рішення має обмеження, wmctrl працює лише з вікнами x11.

Я зараз дізнався, як отримати заголовок вікна, на якому ви натискаєте.

print("Please click on the browser window") opened_tab = subprocess.run("qdbus org.kde.KWin /KWin queryWindowInfo | grep caption", shell=True, capture_output=True).stdout.decode("utf-8 ) opened_tab_title = opened_tab.rstrip(" - Vivaldi\n").lstrip("caption: ")

Потім можна використовувати скрипт із попереднього рішення.

Вирішення можна покращити, використовуючи запит списку вікон kwin на Wayland. Я був би радий, якщо хтось допоможе покращити це . На жаль, я не знаю, як отримати список вікон Wayland.

Примітка: Видаліть пробіли у двох рядках для крихітного URL нижче.Stack Overflow не дозволяє використовувати крихітне посилання тут.

import ahk import win32clipboard import traceback import appJar import requests import sys import urllib import selenium import getpass з selenium import webdriver від selenium.webdriver.chrome.options import Options import socket import time urllib. ActionChain # Ви будете грати з AHK. з appJar import gui try: ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe") except: ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32 .exe") finally: pass chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--start-maximized') chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])); chromeDriver = webdriver.Chrome('C:\new_software\chromedriver.exe', chrome_options = chrome_options) def ahk_disabledevmodescript(): try: ahk = AHK(executable_path="C:\Program Files\Auto" exe") except: ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe") finally: pass ahk_disabledevmodescriptt= [ str('WinActivate,ahk_exe chrome.exe'), str('Send '), ] # Run-Script for snipet in ahk_disabledevmodescriptt: ahk.run_script(snipet, blocking=True ) return def launchtabsagain(): chromeDriver.execute_script("window.open('https://developers.google.com/edu/python/introduction'; 'tab ") chromeDriver.execute_script("window.open('https://www.facebook.com/', 'tab3');") chromeDriver.execute_script("window.open('https://developer.mozilla.org/en -US/docs/Web/API/Window/open', 'tab4');") chromeDriver.execute_script("window.open('https://www.easyespanol.org/', 'tab5');") chromeDriver.execute_script("window.open('https://www.google.com/search?source=hp&ei=EPO2Xf3EMLPc9AO07b2gA w&q=programming+is+not+difficult&oq=programming+is+not+difficult&gs_l=psy-ab.3..0i22i30.3497.22282..22555. 9.0..0.219.3981.21j16j1. 0. 1..gws-wiz.6..0i362i308i154i357j0j0i131j0i10j33i22i29i30..10001%3A0%2C154.h 1w5MmbFx7c&ved=0ahUKEwj9jIyzjb_lAhUzLn0KHbR2DzQQ4dUDCAg&uact=5', 'tab6');") chromeDriver.execute_script("window.open('https://www.google.com/search?source=hp&ei=NvO2XdCrIMHg9APduYzQDA&q=dinner+recipes&oq=&gs_l=psy-ab.1.0.0i362i305.3.6.3) 0.0..0.179.179.0j1. 0. gws-wiz. ') compoanionWindow = ahk.active_window launchtabs = launchtabsagain() disabledevexetmessage = ahk_disabledevmodescript() def copyUrl(): try: ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe") except: ahK :\Program Files\AutoHotkey\AutoHotkeyU32.exe") finally: pass snipet = str('WinActivate,ahk_exe chrome.exe') ahk.run_script(snipet, blocking=True ) compoanionWindow.activate() ahk_TinyChromeCopyUR ahk_exe chrome.exe'), str('send ^l'), str('sleep 10'), str('send ^c'), str('BlockInput, MouseMoveoff'), str('clipwait'), ] # Запуск-AHK Script if ahk: for snipet in ahk_TinyChromeCopyURLScript: ahk.run_script(snipet, blocking=True ) win32clipboard.OpenClipboard() urlToShorten = win32clipboard.GetClipboardData() win32clipboard.CloseClipboard() return(urlToShorten) def tiny_url(url: tinyurl. com/api – create. php? url=" #remove spaces here tinyp = requests.Session() tinyp.proxies = tinyUrl = tinyp.get(apiurl+url).text returnedresponse = tinyp.get(apiurl+url) if returnedresponse.status_code 'Success! =' + str(returnedresponse)) else: print('Code returned = ' + str(returnedresponse)) print('From IP Address =' ​​+IPadd) except: apiurl = "https:// tinyurl. com/api – create.php? url= " #remove spaces here tinyp = requests.Session() tinyUrl = tinyp.get(apiurl+url).text returnedresponse = tinyp.get(apiurl+url) if returnedresponse.status_code == 200:print code = '+ str(returnedresponse)) print('From IP Address =' ​​+IPadd) else: print('Code returned = ' + str(returnedresponse)) return tinyUrl def tinyUrlButton(): longUrl = copyUrl() try: ah ="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe") except: ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe") finally: pass try: shortUrl = tiny_url(longUrl) win32 () win32clipboard.EmptyClipboard() win32clipboard.SetClipboardText(shortUrl) win32clipboard.CloseClipboard() якщо: try: якщо str(shortUrl) == 'Error': ahk.run_script("Msgbox,26 "`rPlease make sure there is link to copy and that the page is fully loaded., 5.5" ) else: ahk.run_script("Msgbox,262144 ,Done.,"+ shortUrl + " is in your clipboard., 1. ) # ahk.run_script("WinActivate, tinyUrl" ) except: traceback.print_exc() print('error during ahk script') pass except: print('Error getting tinyURl') traceback.print_exc() def closeChromeTabs(): try: try: ahk = AHK(executable_ "C:\Program Files\AutoHotkey\AutoHotkeyU64.exe") except: ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe") finally: pass compoanionWindow.activate() ahk_CloseChromeOtherTab WinActivate, ahk_exe chrome.exe'), str('Mouseclick, Right, 30, 25,,1'), str('Send'), str('BlockInput, MouseMoveOff'), ] : ahk.run_script(snipet, blocking=True ) return(True) except: traceback.print_exc() print("Failed to run closeTabs function.") ahk.run_script('Msgbox,262144,,Failed to run closeTabs function.,2') return(False) # and testing this library.window = gui("tinyUrl and close Tabs test", "200x160") window.setFont(9) window.setBg("blue") window.removeToolbar(hide=True) window.addLabel("description", "Testing AK .") window.addLabel("title", "tinyURL") window.setLabelBg("title", "blue") window.setLabelFg("title", "white") window.addButtons(["T"], tinyUrlButton) window. addLabel("title1", "Close tabs") window.setLabelBg("title1", "blue") window.setLabelFg("title1", "white") window.addButtons(["C"], closeChromeTabs) window.addLabel("title2", "Launch tabs") win .setLabelBg("title2", "blue") window.setLabelFg("title2", "white") window.addButtons(["L"], launchtabsagain) window.go() if window.exitFullscreen(): chromeDriver.quit() def closeTabs(): try: ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe") except: ahk = AHK(executable_path="C:Program Files\AutoHotkey\AutoHotkeyU32.exe") .activate() ahk_CloseChromeOtherTabsScript = [ str('WinActivate,ahk_exe chrome.exe'), str('Mouseclick, Right, 30, 25,,1'), str('Send'), str('BlockInput, MouseMoveOff'), ] #Run-Script if ahk: for snipet in ahk_CloseChromeOtherTabsScript: ahk.run_script(snipet, blocking=True ) return(True) except: traceback.print_exc() print("Failed to run closeTabs function.") ahk.run_script('Msgbox,262144,Failed,Failed to rui. 2') return(False)

Знайшов спосіб використовувати бібліотеку ahk. Дуже простий для нас, які не є програмістами, які мають вирішити цю проблему. Використав Python 3.7.3

Встановіть ahk за допомогою pip install ahk

import ahk from ahk import AHK import selenium from selenium import webdriver from selenium.webdriver.chrome.options import Options options = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ['enable-automation #to disable infobar про chrome controlled by automation.chrome_options.add_argument('--start-maximized') chromeDriver = webdriver.Chrome('C:\new_software\chromedriver.exe', chrome_options = options) #specify your chromedriver location chromeDriver.get('http .autohotkey.com/')#launch a tab #launch деякі інші random tabs for testing. chromeDriver.execute_script("window.open('https://developers.google.com/edu/python/introduction', 'tab2');") chromeDriver.execute_script("window.open('https://www. facebook.com/', 'tab3');") chromeDriver.execute_script("window.open('https://developer.mozilla.org/en-US/docs/Web/API/Window/open', 'tab4');"`) seleniumwindow = ahk.active_window #as soon as you open you Selenium session, get a handle of the window frame with AHK. seleniumwindow.activate() #will activate whatever tab ви маєте активну в Selenium browser як AHK is activating the window frame #To activate specific tabs I would use chromeDriver.switchTo() #chromeDriver.switch_to_window(chromeDriver.window_handles[-1]) Ця стаття ви до останніх оголошених tab в Selenium and chromeDriver.switch_to_window(chromeDriver.window_handles[1])to second.

Схожі статті

  • Як перейти на попередню вкладку
  • Як на самсунгу перейти з однієї сімки на іншу
  • Як перейти з однієї операційної системи на іншу
  • Як перейти на вкладку
  • Як переписати квартиру на іншу людину
  • Як перейти на наступний рядок без введення
  • Яка комбінація клавіш дозволяє перейти до пошуку на сторінці
  • Як перекинути з однієї папки в іншу
  • Недавні статті

  • Як бродить зернова брага
  • Що робити якщо не засмагаєш на сонці чому засмага погано лягає на шкіру або перестає прилипати
  • Як швидко зняти гель лак без апарату
  • Як робиться Каті голови
  • Яка гребінець краще для об'єму
  • Чим роблять м'яку покрівлю
  • Чи можна залишати крем для обличчя на ніч
  • Де знаходиться датчик селектора
  • географія нашої діяльності
    вулиця Драгоманова, 27
    вул. Курчатова 1Б
    вул. Міцкевича 130
    вул. Лабунського, 1
    вул. Макарова-Пржевальського
    вул. Толстого 10
    вул. Грушевського 28
    вул. Перший промінь (Черняхівського)
    напишіть нам

    сообщение успешно отправлено
    x