seleniumでby_class_nameでスペースが入った要素が取得できずエラーになる時の対処法


seleniumでby_class_nameでスペースが入った複数要素が取得できずエラーになる

selenium のバージョンアップに
伴う仕様変更なのか、以前は問題なく取得できていた要素でエラーが出る様になってしまいました。

elem_sample = driver.find_element_by_class_name("a-link-sample a-text-normal")

以前はこれでOKだったのですが、
要素が見つからないと怒られてしまいます。

具体的なエラーメッセージはこんな感じでした。

File "error_test.py", line 30, in <module>
    elem_itempage = driver.find_element_by_class_name("a-link-sample a-text-normal")
    .........中間省略.......
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message:

原因

原因は、
selenium のバージョンアップに伴い、

要素名にスペースが入った複数複合形の
class要素( 例:aaa bbbとかaaa bbb cccなど)は、
driver.find_element_by_class_name では取得出来なくなったという、仕様変更のようです。

解決法

解決するには、
何らかの代替策で要素を取得する必要がありました。

いくつか選択肢がありますが、
私が、一番分かりやすく簡単に出来た方法は、

by_class_name を使わずに、

driver.find_element_by_css_selector メソッドを使って要素を取得するやり方です。

修正前

elem_sample = driver.find_element_by_class_name("a-link-sample a-text-normal")

これを、この様に書き換えます。

修正後

elem_sample = driver.find_element_by_css_selector(".a-link-sample.a-text-normal")

メソッドをby_class_name からby_css_selector にして、
要素の頭にドット「.」を入れてやります。
また、間にあるスペースも、ドット「.」に書き換えます。

例1:
<class="aaa bbb">
driver.find_element_by_css_selector(".aaa.bbb")

例2:
<class="aaa bbb ccc">
driver.find_element_by_css_selector(".aaa.bbb.ccc")

ポイントは、要素名を入れる際に先頭に必ず"."(ドット)を入れることと
スペースをドットに置換する事です。

これで、driver.find_element_by_css_selector メソッドを使って従来通り、
class 要素(間にスペースが入った複数名のもの)を取得できます。