##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 要素(間にスペースが入った複数名のもの)を取得できます。