webdriverを使ってみる
pythonをしばらく触ってなかたのでリハビリする気持でseleniumのあたらしいwebdriverをつかってみる。
Webアプリケーションのテストにこれから使っていきたいが、まずは初歩の初歩から、、、( ̄∇ ̄ )
ステータスバーの右側に「WebDriver」と表示されている。
とりあえずフォームの入力についての各要素での操作に慣れたい。
準備
こちらを参照→ selenium · PyPI
コード
まずはHTMLファイル。もちろんDancer等で簡単なフォーム作る方がいいけかな。
まぁ、超手抜きに静的HTMLwww
<html> <head> </head> <body> <form method="post" action="" id="form1"> <p> name: <input type="text" name="name"> </p> <p> bloodtype: <input type="checkbox" name="bloodtype" value="A">A <input type="checkbox" name="bloodtype" value="B">B <input type="checkbox" name="bloodtype" value="O">O <input type="checkbox" name="bloodtype" value="AB">AB </p> <p> hobby: <input type="radio" name="hobby" value="singging">singging <input type="radio" name="hobby" value="taking photo">taking photo <input type="radio" name="hobby" value="cycling">cycling </p> <p> self-introduction: <textarea name="selfintro"></textarea> </p> <p> <input type="button" id="submit_btn" value="submit"> </p> </form> <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> <script type="text/javascript"> $(function(){ $('#submit_btn').click(function(){ $('#form1').attr('action', 'hoge/add').submit(); }); }); </script> </body> </html>
適当に保存してwebブラウザからhttpでアクセスできるようにしておく。
で、こちらがpythonのコード。
from selenium import webdriver from random import randint from lxml import html from time import sleep browser = webdriver.Firefox(); browser.get("[% フォームのURL %]"); root_element = html.fromstring(browser.page_source); bloodtypes = root_element.xpath('//input[@name="bloodtype"]') hobbies = root_element.xpath('//input[@name="hobby"]') foods = ['curry rice', 'ramen', 'pasta', 'chicken'] browser.implicitly_wait(30) for i in xrange(1, 20): browser.refresh() browser.find_element_by_name('name').send_keys('fn7') browser.find_element_by_xpath('//input[@name="bloodtype" and @value="%s"]' % bloodtypes[randint(0, len(bloodtypes) - 1)].get('value')).click() browser.find_element_by_xpath('//input[@name="hobby" and @value="%s"]' % hobbies[i % len(hobbies)].get('value')).click() browser.find_element_by_name('selfintro').send_keys('i like %s' % foods[randint(0, len(foods)-1)]) sleep(3); browser.close();
これを実行すると、自分のプロファイルとは別のものを使用してFirefoxが起動し、フォームを読み込む。
browser.getで読み込んだソースをlxmlのxpathを使ってElementリストを取得している。これはbrowser.find_element_by_xpathではリストにならなかったから。seleniumのjavascriptの方でもリストにならなかったのと根が同じなのかもしれない。
んで、あとはループしてその中で値を設定していく。
フォームの送信をするには、browser.find_element_by_tag_name('form').submit()でOK。しかしwaitForPageToLoadのように待ってくれないのでbrowser.implicitly_wait(30)のように待ちを指定しておく。これは一回設定すれば良いそうだ。
詳しくは python -i して help()。
pythonはインスタンスに対してもhelp()できるので超便利やね。