LoginSignup
58
55

More than 1 year has passed since last update.

【Python】Selenium4の新機能まとめ

Last updated at Posted at 2021-10-22

はじめに

この記事は、Selenium4へのアップデートで新しく追加された機能について、Selenium公式サイトのアナウンスドキュメントからまとめたものです。抜け漏れに気付いたら随時追加します。

なお、Selenium WebDriverに関する記述であり、Selenium IDEやSelenium Gridに関しては言及していません。

使用するツール

Selenium4の導入方法

・Seleniumのバージョンを指定してインストールする

pip install selenium==4.0.0

・Selenium3からアップデートする

pip install -U selenium

Selenium4の新機能

タブとウィンドウの新規作成

新しいドライバオブジェクトを作成せずに、同じセッションで新しいタブやウィンドウを作成し、フォーカスすることができます。例えばURLを新しいタブで開きたい場合、Selenium3ではハンドルの切り替え(switch_to.window())を行っていましたが、これが不要になります。
※参考:Browser manipulation - Create new window (or) new tab and switch | Selenium

URLを新しいタブで開く方法をSelenim3とSelenium4で比べてみます。

Selenium3の場合

create_new_tab_selenium3
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("URLその1")

# 新しいタブを作成
driver.execute_script("window.open()")

# 新しいタブに切り替え
driver.switch_to.window(driver.window_handles[1]) 

driver.get("URLその2")

Selenium4の場合

create_new_tab_selenium4
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("URLその1")

# 新しいタブを作成し、フォーカスする
driver.switch_to.new_window("tab")
driver.get("URLその2")

新しいウィンドウで開きたい場合は、new_window("window")とするだけでOKです。

ウィンドウの最小化

文字通り、カレントブラウザが表示されているウィンドウを最小化します。
※参考:Browser manipulation - Minimize window | Selenium

minimize
driver.minimize_window()

相対ロケータ / Relative Locator

指定した要素の近くにある要素を見つけるための機能です。
※参考:Locating elements - Relative Locator | Selenium

利用可能な相対ロケータは以下の通り。

  • above: 指定した要素よりに表示される要素
  • below: 指定した要素よりに表示される要素
  • toLeftOf: 指定した要素よりに表示される要素
  • toRightOf: 指定した要素よりに表示される要素
  • near: 指定した要素から最大 50px離れた要素

実際に、サンプルサイト「HOTEL PLANISPHERE」の宿泊プラン一覧を対象に使ってみます。

ここでは、下図プラン一覧中央の「出張ビジネスプラン」の見出しを基準要素として、それぞれの相対ロケータに該当する要素を取得します。

image.png

使用例①:条件1つ

relative_locator
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with

driver = webdriver.Chrome()
driver.get("https://hotel.testplanisphere.dev/ja/plans.html")

# 基準とする要素を取得
base = driver.find_element(By.CSS_SELECTOR, "#plan-list > div:nth-child(2) > div > div > h5")

# 上に表示される要素のうち、CLASS名が`card-title`のもの
targets = driver.find_elements(locate_with(By.CLASS_NAME, "card-title").above(base))
print("above:", [x.text for x in targets])

# 左に表示される要素のうち、CLASS名が`card-title`のもの
targets = driver.find_elements(locate_with(By.CLASS_NAME, "card-title").to_left_of(base))
print("left:", [x.text for x in targets])

# 最大 50px 離れた要素
targets = driver.find_elements(locate_with(By.CLASS_NAME, "card-title").near(base))
print("near:", [x.text for x in targets])

実行結果は以下の通り。 基準となる要素に近い順でリストアップされます。

実行結果
above: ['お得な特典付きプラン']
left: ['素泊まり', '貸し切り露天風呂プラン']
near: ['素泊まり', 'エステ・マッサージプラン']

image.png

使用例②:複数条件

複数条件を組み合わせて要素を絞り込むこともできます。

multi_relative_locator
targets= driver.find_elements(locate_with(By.CLASS_NAME, "card-title").below(base_plan).to_right_of(base))
print([x.text for x in targets])

実行結果は以下の通り。 「出張ビジネスプラン」よりも右下に表示されているプランが取得されました。

実行結果
['テーマパーク優待プラン']

※相対ロケータの注意点

相対ロケータは、表示されている要素の位置を参照しています。

つまり、ウィンドウサイズや倍率によってUIの配置が変わってしまう場合、相対ロケータで取得される要素も変わってしまう可能性が高いので要注意です。

▼ 例:ウィンドウ幅によって配置が異なる

 

参考

58
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
58
55