python用selenium做自動化測試(一)
python 用selenium做自動化測試:
在w3school裡搜尋css
python3 test_w3school_search.py
XPath路徑表示式:
http://www.ruanyifeng.com/blog/2009/07/xpath_path_expressions.html阮一峰
1.基於Python的Selenium自動化測試
練習例項,把官方教程中能實現的方法都實現一下(在上面的案例中進行更改)
直接執行:直接用unittest.main()
執行,這裡它搜尋所有以test開頭的測試用例方法,按照ASCII的順序執行多個用例。
-
與頁面互動(輸出W3School中HTML教程中的相關列表文字)
因為我沒有用到測試套件,所以測試的時候打開了兩次瀏覽器,但其實在第一次開啟瀏覽器的時候就已經看到了輸出,程式碼如下:
class W3schoollist(unittest.TestCase): 26 def setUp(self): 27 binary=FirefoxBinary('/usr/local/firefox/firefox') 28 self.driver=webdriver.Firefox(firefox_binary=binary) 29 def test_list_in_w3school(self): 30 driver=
-
選擇下拉列表,處理
SELECT
元素 -
控制瀏覽器前進後退:
1 from selenium import webdriver
2 from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
3
4 binary=FirefoxBinary('/usr/local/firefox/firefox')
5 driver=webdriver.Firefox(firefox_binary=binary)
6 first_url="http://www.baidu.com"
7 print("now access %s "%(first_url))
8 driver.get(first_url)
9
10 second_url='http://news.baidu.com'
11 print("now access %s"%(second_url))
12 driver.get(second_url)
13
14 print("back to %s"%(second_url))
15 driver.back()
17 print("forward to %s"%(second_url))
18 driver.forward()
19 driver.quit()
- qq郵箱登入:
一直定位不到元素,最後看了這篇部落格解決:
https://blog.csdn.net/otianye/article/details/78203435
需要先通過定位frame然後再定位frame裡邊的某一個元素的方法定位此元素
1 from selenium import webdriver
2 from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
3
4 binary=FirefoxBinary('/usr/local/firefox/firefox')
5 driver=webdriver.Firefox(firefox_binary=binary)
6
7
8 driver.get("https://mail.qq.com/")
9 driver.switch_to_frame("login_frame")
10 driver.find_element_by_id("u").clear()
11 driver.find_element_by_id("u").send_keys("[email protected]")
12 driver.find_element_by_xpath("//*[@id='p']").clear()
13 driver.find_element_by_xpath("//[@id='p']").send_keys("passward")
14 driver.find_element_by_xpath("//[@id='login_button']").click()
15 driver.quit()
- submit()方法用於提交表單
1 from selenium import webdriver
2 from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
3
4 binary=FirefoxBinary('/usr/local/firefox/firefox')
5 driver=webdriver.Firefox(firefox_binary=binary)
6 driver.get("http://www.youdao.com")
7driver.find_element_by_id('translateContent').send_keys('hello')
8 driver.find_element_by_id('translateContent').submit()
9 driver.quit()
- 滑鼠事件(將關於滑鼠操作方法封裝在ActionChains類內提供)
1 from selenium import webdriver
2 from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
3 from selenium.webdriver.common.action_chains import ActionChains
4
5 binary=FirefoxBinary('/usr/local/firefox/firefox')
6 driver=webdriver.Firefox(firefox_binary=binary)
7 first_url="http://sahitest.com/demo/index.htm"
8 driver.get(first_url)
9 mouseover_url="http://sahitest.com/demo/mouseover.htm"
10 driver.get(mouseover_url)
11 driver.find_element_by_name("t1").clear()
12 driver.find_element_by_name("t1").send_keys("username")
13 above=driver.find_element_by_name("t1")
#滑鼠懸停
14 ActionChains(driver).move_to_element(above).perform()
15 driver.back()
16 drag_url="http://sahitest.com/demo/dragDropMooTools.htm"
17 driver.get(drag_url)
18 element=driver.find_element_by_id("dragger")
19 target=driver.find_element_by_xpath("/html/body/div[4]")
#滑鼠拖放
20 ActionChains(driver).drag_and_drop(element,target).perform()
21 driver.back()
22 driver.quit()
- 獲得驗證資訊(以qq郵箱登入為例)
2.Selenium和unittest結合
3.Test Suites
參考:https://blog.csdn.net/u011436666/article/details/73473013
用測試套件的形式組織一下測試(就使用與頁面互動的案例中的兩個測試用例):
1 import unittest
2 from selenium import webdriver
3 from selenium.webdriver.common.keys import Keys
4 from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
5 class W3schooltest(unittest.TestCase):
6
7 def setUp(self):
8 binary = FirefoxBinary('/usr/local/firefox/firefox')
9 self.driver = webdriver.Firefox(firefox_binary=binary)
10 self.driver.implicitly_wait(10)
11
12
13 def test_search_in_w3school(self):
14 driver = self.driver
15 driver.get("http://www.w3school.com.cn")
16 self.assertIn("w3school",driver.title)
17
18 elem=driver.find_element_by_name("as_q")
19 elem.send_keys("css")
20 elem.send_keys(Keys.RETURN)
21 elem.submit()
22 assert "No results found." not in driver.page_source
23 print("test01")
24
可以看到執行的兩個測試是按照我呼叫的順序來的,test2->test1
4.Selenium-grid
Selenium-Grid可以測試集分佈在多個環境中並行執行測試用例。這有兩個好處。 首先,如果你有一個大的測試集或者一個執行緩慢的測試集,你可以通過使用Selenium Grid來劃分你的測試集,同時使用這些不同的機器來執行不同的測試。另外,如果您必須在多個環境中執行測試套件,您可以讓不同的遠端機器同時支援並執行您的測試。 在每種情況下,Selenium Grid通過使用並行處理大大縮短了執行套件所需的時間。
這個的使用後期研究後會再總結~
5.美化報告樣式和傳送結果郵件:
參考:https://blog.csdn.net/u011436666/article/details/73473013
1 import unittest
2 import smtplib
3 from email.mime.text import MIMEText
4 from email.header import Header
5 import time
6 import HTMLTestRunner
7 from email.mime.application import MIMEApplication
8 #傳送郵件
9 def send_email(report_file):
10 sender = "*@qq.com"
11 receiver="*@qq.com"
12 smtpserver="smtp.qq.com"
13 username="*@qq.com"
14 password="授權碼"
15 #郵件正文
16 file=open(report_file,"rb")
17 mail_body=file.read()
18 file.close()
19
20 msg=MIMEText(mail_body,_subtype="html",_charset="utf-8")
21 msg["Subject"]= u"test_report"
22
23 smtp=smtplib.SMTP_SSL("smtp.qq.com")
24 smtp.login(username,password)
25 smtp.sendmail(sender,receiver,msg.as_string())
26 smtp.quit()
27 print("Email has send out!")
#將用例新增到測試套件中
28 def creatsuite():
29 testunit=unittest.TestSuite()
30 test_dir=".//testcase"
31 discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py",top_level_dir=None)
32 for test_suite in discover:
33 for test_case in test_suite:
34 testunit.addTest(test_case)
將HTMLTestRunner.py移入python安裝目錄(僅支援python2,網上有教程可以修改到支援py3):
mv HTMLTestRunner.py /usr/lib/python2.7/site-packages/
注意:密碼是qq郵箱第三方授權碼!!!,如果你使用自己的密碼則會報錯:
smtplib.SMTPAuthenticationError: (535, 'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb\xb5\xc7\xc2\xbc\xa1\xa3\xcf\xea\xc7\xe9\xc7\xeb\xbf\xb4: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')
這是發到我郵箱的: