tapitapi’s blog

1日1杯タピオカ!エンジニア

【Selenium】expected_conditionsの使い方

SeleniumのWebDriverで、

期待したコンディションかどうか調べるexpected_conditionsをよく使うので、備忘録(日本語訳がなかったので、、、)

 

公式リファレンスはこちら

selenium-python.readthedocs.io

 

expected_conditions classで使用できる関数のリスト

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present

 

使用例

(id="someid" の要素がクリックできるまで待つ。10秒経ってもクリックできるようにならなかったら、例外エラー発生)

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))

 

*title_is(title)

ページのタイトルが引数titleと同じか。

戻り値:ページのタイトルが引数titleと同じならtrue, 違うならfalse

 

解説

wait.until(EC.title_is(title))のように、wait.until内で使用する場合、wait.untill(false)で例外エラーになります。)

 

*title_contains(title)

ページのタイトルが引数titleを含んだタイトルか。

戻り値:ページのタイトルが引数titleを含んだタイトルならtrue, 違うならfalse

 

*presence_of_element_located(locator)

ページのDOMに、locatorで指定した要素が存在するか。cssなどでhiddenやinvisibleになっていても、存在するとみなす。(コード内に要素が表示されていればOK)

戻り値: locatorで指定した要素が存在すれば、その要素。存在しないならfalse

 

詳細:

引数のlocatorは(By.ID, 'someid') のような物です。なので使う時は、EC.presence_of_element_located(By.ID, 'someid') のように使用。

by.IDなど、byの後に指定できる物のリストはこちら

 

visibility_of_element_located(locator)

ページのDOMに、引数locatorで指定した要素がvisibleかつ、要素のwidth&heightが0以上か

戻り値: locatorで指定した要素がvisibleかつ、要素のwidth&heightが0以上になれば、その要素。それ以外ならfalse

 

visibility_of(element)

ページのDOMに、引数elementで指定した要素がvisibleかつ、要素のwidth&heightが0以上か

戻り値: elementで指定した要素がvisibleかつ、要素のwidth&heightが0以上になれば、その要素。それ以外ならfalse

 

詳細:

引数のelementは、username = driver.find_element_by_name('username') のようにfind_element系の関数で取得した物。なので使う時は、EC.visibility_of(username)のように使用。

find_element系の関数の詳細はこちら

 

*presence_of_all_elements_located(locator)

ページのDOMに、locatorで指定した要素が、一つ以上存在するか。cssなどでhiddenやinvisibleになっていても、存在するとみなす。(コード内に要素が表示されていればOK

戻り値: locatorで指定した要素が一つ以上存在すれば、その要素のリスト(配列)。存在しないならfalse

 

*text_to_be_present_in_element(locator, text)

locatorで指定した要素内に、textで指定した文字列が存在するか

戻り値:記載なかったですが、おそらくlocatorで指定した要素内に、textで指定した文字列が存在するならtrue, それ以外ならfalse

 

*text_to_be_present_in_element_value(locator, text)

locatorで指定した要素のvalue内に、textで指定した文字列が存在するようになるまで待つ。

戻り値:記載なかったですが、おそらくlocatorで指定した要素のテキスト内に、textで指定した文字列が存在するならtrue,それ以外ならfalse

 

解説:text_to_be_present_in_elementとtext_to_be_present_in_element_valueの違い

text_to_be_present_in_element((By.ID, 'someid'), 'text') でtrue

<p id="someid">this is text</p>

text_to_be_present_in_element_value((By.ID, 'someid'), 'text') でtrue

<input id="someid" type="button" value="button text value">

 

参考:

python - Selenium - Difference between text_to_be_present_in_element and text_to_be_present_in_element_value - Stack Overflow

 

 

*frame_to_be_available_and_switch_to_it(locator)

locatorで指定した要素が(フレームとして)切替可能か

戻り値:切替可能ならtrue, 不能ならfalse

 

*invisibility_of_element_located(locator)

visibility_of_element_located の逆

戻り値: 記載なかったですが、locatorで指定した要素がvisibleかつ、要素のwidth&heightが0以上になれば、false。それ以外ならtrue

 

*element_to_be_clickable(locator)

locatorで指定した要素がクリック可能か

戻り値:記載なかったですが、クリック可能ならtrue, 不能ならfalse

 

*staleness_of(element)

DOMツリーの中に、elementで指定した要素が無くなるまで待つ。

戻り値:elementで指定した要素がまだあればfalse, それ以外ならtrue(これって、要素が無くなるまで待つ最大時間はどこで指定するのかな、、、、?)

 

*element_to_be_selected(element)

elementで指定した要素が選択されているか(select option)

戻り値:elementで指定した要素が選択されていればtrue, それ以外ならfalse

 

*element_located_to_be_selected(locator)

locatorで指定した要素が選択されているか(select option)

戻り値:locatorで指定した要素が選択されていればtrue, それ以外ならfalse 

 

*element_selection_state_to_be(element, is_selected)

引数is_selectedがtrueなら、elementで指定した要素が選択されているか。falseならelementで指定した要素が選択されていないか。

戻り値:引数is_selectedがtrueなら、elementで指定した要素が選択されていればtrue, それ以外ならfalse 。引数is_selectedがfalseなら逆。

 

*element_located_selection_state_to_be(locator, is_selected)

element_selection_state_to_beのlocatorバージョン

戻り値:引数is_selectedがtrueなら、locatorで指定した要素が選択されていればtrue, それ以外ならfalse 。引数is_selectedがfalseなら逆。

 

*alert_is_present()

引数なし。アラートが存在しているか

戻り値: アラートが存在していればtrue,それ以外はfalse

 

 

以上ですー!

 

WebDriverには段々と慣れてきましたが、そろそろpython の文法をしっかりやらないと、、、少し複雑なコードになると読めない >< 地道にやっていこうと思います。

 

おやすみーーー