at backyard

Color my life with the chaos of trouble.

Pythonの Selenium でshadowRootを取得するときにdictで取得されてしまう件

AttributeError: 'dict' object has no attribute 'find_element_by_class_name'

SeleniumでShadow DOM配下(shadowRoot配下)の要素を取得するときは下記のようなコードを挟む必要がある。
(このコードを挟まずにそのまま取得しようとすると、失敗する)

shadow_root_element = driver.execute_script('return arguments[0].shadowRoot', hoge)

# shadowRoot配下の要素をclass名をもとに取得する場合
name = shadow_root_element.find_element_by_class_name("fuga")

ただ、今回 chromedriver-binary を下記のバージョンに上げたら、ここの処理で問題が発生した。

chromedriver-binary==96.0.4664.45.0

エラーの内容は下記の通りで、elementではなくdictで返ってきてしまうようになっていた。

AttributeError: 'dict' object has no attribute 'find_element_by_class_name'

この問題に対しては既にissueが上がっている。

github.com

解決方法としてはバージョンを下げたものをひとまずは利用すれば良いようだ。
(私が利用していたChromeは96だったが、以下のバージョンでも問題なく動作した。)

pip install chromedriver-binary==95.0.4638.69.0