

seleniumでWebを開いた後，ユーザが操作をすることで開いたページのurlを取得しようとしました．

[code]

    from selenium import webdriver
    import time
    
    browser = webdriver.Chrome('chromedriver.exe')
    browser.get('https://kakolog.jp/q/')
    while True:
        time.sleep(1)
        print(browser.current_url)
    
[/code]

上のコードでWebを開いた後各スレッドをクリックすると，別のタブでページを開かれ，そのページのurlを取得できませんでした．

どうすればこのurlを取得できますか?


CC BY-SA 4.0
2022-01-05T05:13:08.117
85492
2022-01-05T07:43:21.460
49026
question
python selenium
seleniumを使ったweb操作で別タブに開いてしまったサイトのurlを取得したい


リンク先のURLを取得することが目的であれば、クリックせずに`<a target="_blank" ...
href="URL">`から`href`を直接抽出することができます。  
(サンプルコードの「# 1.エレメントから最初のアンカーを読み取り、URLを取得する」をご参照ください)  
そこから[`driver.get`](https://www.seleniumqref.com/api/python/window_set/Python_get.html)でポップアップせずに遷移する処理が可能です。

また、クリック後にポップアップしたタブのURL取得や操作をする場合は、`driver.switch_to.window`で任意のタブをアクティブにすることで対応可能です。  
(サンプルコードの「# 2.ポップアップタブをアクティブ化し、アクティブタブのURLを取得する」をご参照ください)

参考資料: [How to get the URL "about:blank" from empty tab using
selenium?](https://stackoverflow.com/q/55650317)

**サンプルコード：**

[code]

    from selenium import webdriver
    import chromedriver_binary
    import time
    
    driver = webdriver.Chrome('chromedriver.exe')
    url='https://kakolog.jp/q/'
    
    driver.get(url)
    time.sleep(1)
    
    # 先頭の 'boxContainer item' エレメントを取得
    element = driver.find_element_by_class_name('boxContainer.item')
    # 1.エレメントから最初のアンカーを読み取り、URLを取得する
    anchor = element.find_element_by_class_name('link')
    print(anchor.get_attribute('href'))
    
    # メインタブのウィンドウハンドルを保持しておく
    main_tab = driver.current_window_handle
    
    # アンカーをクリックしてポップアップ
    anchor.click()
    time.sleep(1)
    
    # 2.ポップアップタブをアクティブ化し、アクティブタブのURLを取得する
    new_tab = [x for x in driver.window_handles if x != main_tab][0]
    driver.switch_to.window(new_tab)
    print(driver.current_url)
    time.sleep(1)
    
    # アクティブタブを閉じる
    driver.close()
    time.sleep(1)
    
[/code]


CC BY-SA 4.0
2022-01-05T07:43:21.460
85496
2022-01-05T07:43:21.460
9820
85492
answer