1. 程式人生 > >python用selenium做自動化測試(一)

python用selenium做自動化測試(一)

python 用selenium做自動化測試:

1538832115545

在w3school裡搜尋css

python3 test_w3school_search.py

1538832221692

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=
    self.driver 31 driver.get("http://www.w3school.com.cn") #google開發者工具裡面可以直接copy XPath. 32 elems=driver.find_elements_by_xpath("//*[@id='navsecond']/ul[1]/li") 33 for ele in elems: 34 print ele.text 35 def tearDown(self): 36 self.driver.close()

1538881251637

  • 選擇下拉列表,處理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()

1539067140860

  • 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         

1538883477042

可以看到執行的兩個測試是按照我呼叫的順序來的,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')

1538897674587

這是發到我郵箱的:

在這裡插入圖片描述