web-dev-qa-db-ja.com

Seleniumでアクティブなタブに切り替えるにはどうすればよいですか?

Chrome拡張機能を開発し、拡張機能をSeleniumでテストしたいと思います。テストを作成しましたが、問題は拡張機能がインストールされたときに新しいタブを開くことです。テスト中のアクティブなタブに切り替えることはできますか?または、拡張機能を無効にしてからWebサイトにログインし、拡張機能を有効にするだけで別のオプションを選択することもできます。私のコード:

_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')コマンドの後にのみ開くと思います)。

更新:例外は追加のタブに関連していないことがわかりました。それは当社のウェブサイトからのものです。しかし、@ abernaの答えによると、このコードで余分なタブを閉じました。

_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])
_

余分なタブを閉じると、ビデオにタブが表示されます。

31
Uri

いくつかの可能なアプローチ:

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()

-別のアプローチでは、Seleniumメソッドを使用して現在のウィンドウをチェックし、別のウィンドウに移動できます。

使用できます

driver.window_handles

ウィンドウハンドルのリストを検索し、次の方法を使用して切り替えを試みます。

- driver.switch_to.active_element      
- driver.switch_to.default_content
- driver.switch_to.window
27
aberna

これは3.xで実際に機能しました。

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

ウィンドウハンドルが追加されるため、リストの2番目のタブが選択されます

最初のタブから続行するには:

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

受け入れられた答えは私にはうまくいきませんでした。
新しいタブを開いてSeleniumに切り替えるには、次を使用しました。

_driver.execute_script('''window.open("https://some.site/", "_blank");''')
sleep(1) # you can also try without it, just playing safe
driver.switch_to_window(driver.window_handles[-1]) # last opened tab handle
# driver.switch_to.window(driver.window_handles[-1])  for newer versions.
_

メインタブに戻る必要がある場合は、次を使用します。

_driver.switch_to_window(driver.window_handles[0])
_

概要:

_window_handles_には、開いているhandlestabsのリストが含まれています。switch_to_window()の引数として使用して、タブを切り替えます。

8
Pedro Lobito