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ではリストにならなかったから。seleniumjavascriptの方でもリストにならなかったのと根が同じなのかもしれない。

んで、あとはループしてその中で値を設定していく。
フォームの送信をするには、browser.find_element_by_tag_name('form').submit()でOK。しかしwaitForPageToLoadのように待ってくれないのでbrowser.implicitly_wait(30)のように待ちを指定しておく。これは一回設定すれば良いそうだ。

詳しくは python -i して help()。
pythonインスタンスに対してもhelp()できるので超便利やね。