Selenium RC
JavaScriptのコードを対象のページに埋め込んでブラウザを自動操作する。まだ使えるようだが非推奨という扱いになっている。Selenium WebDriver
2020年の時点ではこちらの「Selenium」が使われる。ブラウザの拡張機能やOSのネイティブ機能などを利用してブラウザを自動操作する。ChromeでSeleniumを使うには?
ChromeでSeleniumを使うにはChromeDriverが必要とのこと。ChromeDriverとは?
Chrome用のWebDriver。WebDriverとは?
WebDriverは、多くのブラウザでWebアプリを外部から操作するためのオープンソースツール。まとめ
Windows10環境である場合、Chrome, ChromeDriver, Selenium, Python3を組み合わせて自動操作システムを構築するようだ。$ pip install selenium
Seleniumを実行するまでの手順
$ pip install selenium参考:WinpythonにSeleniumをインストール
import time
from selenium import webdriver
driver = webdriver.Chrome(executable_path='lib¥¥chromedriver.exe')
driver.get('https://www.google.com/')
time.sleep(5)
search_box = driver.find_element_by_name("q")
search_box.send_keys('赤猫')
search_box.submit()
time.sleep(5)
driver.quit()
メソッド | 説明 |
---|---|
elm = driver.find_element_by_id("neko1") |
IDを指定して要素を取得する。 JavaScriptにより動的に追加された要素も取得可能。
|
elm.submit() |
Submitボタンを自動押下。 elm(要素)はsubmitボタン要素である必要はなく、form内のいずれかのinput要素でもよい。 |
elm = find_element_by_name('要素のname属性') | name属性を指定して要素を取得する。 |
elm = driver.find_element_by_xpath("//input[@name='neko_memo'][@type='text']") |
jQueryのようなセレクタ指定方式で要素を取得する。 最初に見つかった要素を一つ取得する。 |
elm = driver.find_element_by_link_text('Wikipedia') |
a要素のリンクテキストを指定して要素を取得する。
|
elm = driver.find_element_by_partial_link_text('Wiki') |
a要素のリンクテキストを部分一致検索して要素を取得する
|
elm.click() |
find_element_by_link_textで取得したa要素で「elm.click()」を実行すると、ハイパーリンク先のページに移動する。 また、ボタン要素で「elm.click()」を実行すると、ボタン自動押下を行い、JavaScriptのonclickイベントを発動させることができる。 |
elm = driver.find_element_by_tag_name("input") |
タグ名で最初に見つかった要素を取得する。 |
elm = driver.find_element_by_class_name("neko_class") |
class属性名そ指定して最初に見つかった要素を取得する。 |
elm = driver.find_element_by_css_selector('input.neko_class') | 参照:セレクタ:find_element_by_css_selector |
elm.clear() | 要素にセットする値をクリアする。 |
elm.send_keys('あいうえお') | 要素に値を追加する。値を書き換える場合は「elm.clear()」で一旦クリアする。 |
<div>
<script>
function clickBtn1(){
let html = `
<input id='btn2' type='button' value='テストボタン2' onclick='clickBtn2()' />
`;
jQuery('#div1').html(html);
}
function clickBtn2(){
alert('ボタン2をクリックしました。');
}
</script>
<input id="btn1" type="button" value="テストボタン" onclick="clickBtn1()"/>
<div id="div1"></div>
</div>
import time
from selenium import webdriver
driver = webdriver.Chrome(executable_path='lib\\chromedriver.exe')
driver.get('http://localhost/selenium_scraping_demo/web_app_test/test1.php')
time.sleep(3)
elm = driver.find_element_by_id("btn1")
elm.click()
time.sleep(1)
elm = driver.find_element_by_id("btn2")
elm.click()
ケース1
HTML<input id="neko1" type="text" class="neko_class" value="" >
Python
elm = driver.find_element_by_css_selector('input.neko_class')
ケース2
HTML
<div data-id="101">
<input id="neko1" type="text" name="neko_name" class="neko_class" value="新入りの帽子猫" >
</div>
Python
elm = driver.find_element_by_css_selector('div[data-id="101"] > input')
ケース3
HTML<input id="neko1" type="text" value="" >
Python
elm = driver.find_element_by_css_selector('input#neko1')
ケース4
HTML<input id="neko1" type="text" name="neko_name" class="neko_class" value="" >
Python
elm = driver.find_element_by_css_selector('input.neko_class#neko1[name="neko_name"]')
<ol id="plant_list">
<li>アサガオ</li>
<li>ヒルガオ</li>
<li>グンバイヒルガオ</li>
<li>リュウキュウシャリンバイ</li>
</ol>
elms = driver.find_elements_by_css_selector('#plant_list li')
for elm in elms:
print(elm.text)
複数の要素を取得するメソッド一覧