# Selenimu memo (パクリ) ###### tags: `kreisacademy`  ```python # インポート from selenium import webdriver # ブラウザを開く # 本来は Chrome(ここにchromedriverのパスを記載) brew経由で入れた人は記載の必要がありません。 driver = webdriver.Chrome() # webページを開く driver.get(URL) # webページを閉じる driver.close() # ブラウザの終了 driver.quit() ``` #### 要素へアクセスする 様々な要素を指定して取り出す 基本的に、上記のブラウザを起動、指定したURLページを開くのあとは、 取得したい要素をどんどん追加して書いていく。 `find_element_by_xxx()` メソッドを使って、要素を見つけることができる。 `find_elements_by_xxx()`で複数を取得。 |メソッド |指定する要素 | |---|---| |find_element_by_id | id属性で探す | |find_element_by_name |name属性で探す | |find_element_by_XPath |XPathで探す※ | |find_element_by_link_text |ハイパーリンクを探す | |find_element_by_tag_name |タグ名で探す | |find_element_by_class_name |クラス名で探す | |find_element_by_css_selector |CSSセレクタで探す | ※ XPath は、XML文書内のノードの位置を特定するために使用される言語。 id属性やname属性で検索する方法よりもより詳細な検索ができる。 また Chromeの 検証で、見たい要素のhtml部で右クリック=>copyから XPath をコピーする ことが可能。 XPathを使用した例 ```python # html内, body内のフォーム要素 login_form = driver.find_element_by_xpath('/html/body/form[1]') # html全体の最初のフォーム要素 login_form = driver.find_element_by_xpat('//form[1]') # id という名前の属性およびloginFormという値をもつフォーム要素 login_form = driver.find_element_by_xpath("//form[@id='loginForm']") ``` #### アクション 取得した要素に対して、アクションを起こす 上記の方法で要素を取得したら、関数で操作を実行する。 ##### `send_keys` 値を設定する。検索ボックスに文字列を入れるなど。 ```python search_box = driver.find_element_by_name('q') search_box.send_keys('文字列') ``` ##### `click` 要素をクリックする。次のページへボタンなど ```python next_btn = driver.find_element_by_css_selector('body > main > div > a') next_btn.click() ``` ##### `clear` 文字列を削除(クリア)する・ ```python search_box = driver.find_element_by_name('q') search_box.clear() ``` ##### `text` 文字列を取得する。取得したh1タグのテキストなど。 ```python h2_tag = driver.find_element_by_tag_name('h2') h2_tag.text ``` ##### `Keys` クラス Keys クラスは、Return, F1, Shift などのキーボードキーの操作をできる。 Keys クラスは、新たに import して利用する。 ```python from selenium.webdriver.common.keys import Keys # 検索ボックスに文字列を入れて、Return キーを押下。 search_box.send_keys('文字列', Keys.RETURN) ``` ##### `ActionChains` クラス Keys クラス同様、追加で import して使う。 ActionChains クラスは、アクションのメソッドを呼び出すと、 ActionChainsオブジェクトのキューに格納される。 最後に perform() を呼び出すと、イベントはキューに入れられた順に発生する。 ```python from selenium.webdriver.common.action_chains import ActionChains actionChains = ActionChains(driver) # SHIFT キーを押しながら、'saira'という文字列を入力 actionChains.key_down(Keys.SHIFT) actionChains.send_keys_to_element(driver.find_element_by_tag_name('q'), 'saira') actionChains.perform() # ctrl+cを押す actionChains.key_down(Keys.CONTROL) actionChains.send_keys('c') actionChains.key_up(Keys.CONTROL) actionChains.perform() ``` ##### 待機する よくあるのが、画面のロードが完了する前に、処理が走ってしまいエラーになる。それに対処するために必要な要素が準備できるまで、数秒待機することができる。 ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By WebDriverWait(driver, WAIT_SECOND).until(EC.presence_of_element_located((By.CLASS_NAME, 'Btn'))) ``` ##### ブラウザの対象を繰り替える ``` ``` ##### アクションメソッド例 |アクションメソッド |動作 |引数 | |---|---|---| |click(element) |クリック |要素を与えない場合、現在のマウス位置で | |click_and_hold(element) |クリックを押したまま |要素を与えない場合、現在のマウス位置で | |context_click(element) |右クリック |要素を与えない場合、現在のマウス位置で | |double_click(element) |ダブルクリック |要素を与えない場合、現在のマウス位置で | |drag_and_drop(source, target) |source要素をドラッグして、target要素でドロップする |source=ドラッグする要素、target=ドロップする要素 | |key_down(value, element) |装飾キーを送信する |value=装飾キー。値はKeys.CONTROLのように。element=キーを送信する要素。Noneの場合は、現在フォーカスの要素にキーを送信 | |key_up(value, element) |装飾キーを解放する |value=装飾キー。値はKeys.CONTROLのように。element=キーを送信する要素。Noneの場合は、現在フォーカスの要素にキーを送信 | |move_by_offset(xoffset, yoffset) |マウスを現在位置から移動する |xoffset,yoffset=正または負の整数として移動するオフセット量 | |move_to_element(element) |要素の中央に移動する |移動先のWebElement | |send_keys(keys_to_send) |現在フォーカスの要素にキーを送信 |送信キー。Keysクラス | |send_keys_to_element(element, keys_to_send) |要素にキーを送信 |element=キーを送信する要素。keys_to_send=送信キー。Keysクラス |