47
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

47
31
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
47
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?