2020-04-14

タブを切り替える - selenium - python

新しいタブでページが開かれた時は、そのままだと要素が取得できない。
明示的にタブの切り替えをする必要がある。

・(準備)タブを2つ開く

YAHOOのトップページを開いてから、新しいタブで天気・災害ページを開く。
.execute_script() は文字列で指定されたjavascriptを実行する関数。
詳細はまた別の機会に。
from selenium import webdriver


brows = webdriver.Chrome()

brows.get( 'https://www.yahoo.co.jp/' )
brows.maximize_window()

brows.execute_script('window.open(arguments[0], "newtab")', 'https://weather.yahoo.co.jp/weather/?day=1')


・ウィンドウハンドルを取得する

ブラウザのタブにはそれぞれウィンドウハンドルというIDが付いている。
.window_handles でウィンドウハンドルをリストとして取得できる。
from selenium import webdriver


brows = webdriver.Chrome()

brows.get( 'https://www.yahoo.co.jp/' )
brows.maximize_window()

#タブが1つの時
print( brows.window_handles )

brows.execute_script('window.open(arguments[0], "newtab")', 'https://weather.yahoo.co.jp/weather/?day=1')

#タブが2つの時
print( brows.window_handles )

#出力
# ['CDwindow-61046F250634B3E0138D514BE870E2F1']
# ['CDwindow-61046F250634B3E0138D514BE870E2F1', 'CDwindow-F7B2FE085F63BD4904E523C068017BD0']
新しいタブでページを開いた後にウィンドウハンドルが増えているのがわかる。

.current_window_handle で現在のウィンドウハンドルを取得できる。
from selenium import webdriver


brows = webdriver.Chrome()

brows.get( 'https://www.yahoo.co.jp/' )
brows.maximize_window()

brows.execute_script('window.open(arguments[0], "newtab")', 'https://weather.yahoo.co.jp/weather/?day=1')

print( brows.window_handles )
print( brows.current_window_handle )

#出力
# ['CDwindow-052BDF2E9B55B0220E2B8ACC2C0AF793', 'CDwindow-F284652E30DF3E0F9A377712CD504B70']
# CDwindow-052BDF2E9B55B0220E2B8ACC2C0AF793



・タブを切り替える

まずはタブを切り替えずに天気・災害ページの要素をクリックしようとしてみる。
from selenium import webdriver


brows = webdriver.Chrome()

brows.get( 'https://www.yahoo.co.jp/' )
brows.maximize_window()

brows.execute_script('window.open(arguments[0], "newtab")', 'https://weather.yahoo.co.jp/weather/?day=1')

#新しいタブの要素をクリックする
brows.find_element_by_xpath('//a[text()="東京"]').click()

#出力
# selenium.common.exceptions.NoSuchElementException
すると 要素がない とエラーが出る。

次に、タブを切り替えてから同じ要素をクリックする。
.switch_to_window() に切り替え先のウィンドウハンドルを渡すことで切り替わる。
from selenium import webdriver


brows = webdriver.Chrome()

brows.get( 'https://www.yahoo.co.jp/' )
brows.maximize_window()

brows.execute_script('window.open(arguments[0], "newtab")', 'https://weather.yahoo.co.jp/weather/?day=1')

#ここでタブの切り替え
brows.switch_to_window( brows.window_handles[1] )

brows.find_element_by_xpath('//a[text()="東京"]').click()

今度は先ほどのエラーは出ず、要素をクリックすることができる。
画面が表示されていても切り替えをしないと要素を取得できない。

0 件のコメント:

コメントを投稿