# 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クラス |