share facebook facebook facebook twitter twitter menu hatena pocket slack

2019.01.23 WED

Seleniumでelement not interactableって怒られる場合でもエレメントを押下する方法

青池 利昭

WRITTEN BY 青池 利昭

ユーザーが特定のボタンを押下すると表示するカレンダー上のボタン(エレメントはspan)をseleniumで押下するために以下のようなコードを実装して動かして見たところ

# 事前にボタンを押下して対象のカレンダーを表示済み
driver.find_elements_by_xpath("/PATH/TO/ELEMENT").click()

って怒られる。

element not interactable

エレメントの属性を確認していると、is_displayed()の戻り値はFalse。

element = driver.find_elements_by_xpath("/PATH/TO/ELEMENT")
driver.execute_script("arguments[0].style.visibility='visible';", item)
driver.execute_script("arguments[0].style.display='inline-block';", item)
element.click()

とか頑張って見てもis_displayed()の戻り値はFalseのまま。

presence_of_element_locatedを使ってWaitをかけてもタイムアウトして一向に表示扱いになる気配なし。
そもそもブラウザ上での操作を見ていると対象のエレメントは表示されているし、きちんとブラウザの表示領域内に収まっている。
無論、自分で操作したら問題なく押下できている。

仕方ないのでアプローチを変更してエレメントのある領域を押下するという方法で今回は実現できた。

from selenium import webdriver
...
element = driver.find_elements_by_xpath("/PATH/TO/ELEMENT")
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(element, 5, 5)
action.click()
action.perform()

無理やり感がちょっと強いが動くことが大事なテスト用のコードなので大目に見る。

元記事はこちら

Seleniumでelement not interactableって怒られる場合でもエレメントを押下する方法

青池 利昭

青池 利昭

MSP開発チーム所属。毎日PDと戦ってます。最近 CFn をよく使うようになりました。Go言語と最近遊べてません

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。