實戰項目
均來源於互聯網
測試報告2017年11月29日優化后的測試報告:https://github.com/defnngj/HTMLTestRunner
1、項目概述:
本實戰已126郵箱為例子進行了實戰,對登錄、寫郵件、發送郵件、刪除郵件、退出登錄進行了自動化測試;
測試完成后自動發送測試報告到指定郵箱
目錄結構:
auto_working目錄:
report ---> 目錄用於存放測試報告
test_case ---> 存放測試用例目錄,該目錄下面創建測試用例:test_asendmail.py 寫發送郵件 ; test_bserach.py 搜索郵件 ; test_cdel.py 刪除郵件 ; login.py 登錄
HTMLTestRunner.py ---> 自動生成測試報告
all_test.py ---> 運行測試用例
all_test.py
#!/usr/bin/env python # -*- coding:utf-8 -*- # author:tian
from smtplib import SMTP from email.mime.text import MIMEText from email.header import Header import unittest from HTMLTestRunner import HTMLTestRunner import time,os
# 定義發送郵件
def send_mail(file_new): '''發送郵件''' SMTP_host = 'smtp.126.com' #發信郵箱賬號 username = 'test_tx@126.com' #發信密碼一定要126開啟smtp發給的密碼,不是126登錄的密碼 password = 'xxxxxxxxxxxxx' #收件郵箱 to_address = 'xxxxoooo@qq.com' #郵件標題 subject = 'UI自動化測試報告' #連接SMTP服務器,此處用126的SMTP服務器 email_client = SMTP(SMTP_host) #用戶名和密碼登錄 email_client.login(username,password)
f = open(file_new,'rb') read = f.read() f.close() msg = MIMEText(read,_subtype='hmtl',_charset='utf-8') msg['Subject'] = Header(subject,'utf-8') #郵件主題 msg['From'] = username #定義發送郵件人郵箱 msg['To'] = to_address #定義收郵件人郵箱 email_client.sendmail(username,to_address,msg.as_string(msg))#第一個參數發送人郵箱,第二個參數為收件人郵箱,第三個為發送內容 email_client.quit() #退出 def send_report(testreport): '''生成報告''' result_dir = testreport lists = os.listdir(result_dir) #獲取該目錄下面的所有文件 lists.sort(key= lambda fn:os.path.getatime(result_dir+"\\"+fn)) #找到最新生成的文件 file_new = os.path.join(result_dir,lists[-1]) #調用發郵件模塊 send_mail(file_new)
def creatsuite(): '''將用例添加到測試套件''' testunit = unittest.TestSuite() #定義測試文件查找的目錄 test_dir ='./test_case' #定義discover方法的參數 discover = unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py',top_level_dir=None) #discover方法篩選出來的用例,循環添加到測試套件中 return discover
if __name__ == '__main__': now = time.strftime("%Y-%m-%d %H-%M-%S") testreport = './report' filename ='./report/ {0} result.html'.format(now) fp = open(filename,'wb') runner = HTMLTestRunner(stream=fp,title="2017年7月18日ui自動化測試報告",description="運行環境 Windows7 Chrome瀏覽器") alltestnames = creatsuite() runner.run(alltestnames) fp.close() #關閉生成的報告 send_report(testreport) #發送報告
test_case目錄下面的測試用例:
login.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
#登錄
from selenium import webdriver
import time
class Login_Case:
def __init__(self,driver):
self.driver = driver
def login_curres(self,user,passwd):
'''登錄成功'''
self.driver.switch_to_frame("x-URS-iframe")
self.by_id("//input[@name='email']").clear()
self.by_id("//input[@name='email']").send_keys(user)
self.by_id("//input[@name='password']").clear()
self.by_id("//input[@name='password']").send_keys(passwd)
self.by_id(".//*[@id='dologin']").click()
return self.driver
def logout(self):
'''退出登錄'''
self.by_id(".//*[@id='_mail_component_41_41']/a").click()
def by_id(self,the_id):
return self.driver.find_element_by_xpath(the_id)
test_asendmail.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
import unittest
from selenium import webdriver
from time import sleep
from login import Login_Case
class Test_Send_Mail(unittest.TestCase):
driver = webdriver.Chrome()
@classmethod
def setUpClass(cls):
cls.driver.maximize_window()
base_url = "http://mail.126.com/"
cls.driver.get(base_url)
# cls.driver.implicitly_wait(10)
sleep(10)
def obj_metcho(self):
obj = Login_Case(Test_Send_Mail.driver)
return obj
def test_alogin_surcee(self):
'''登錄進入123郵箱'''
username ='test_tx'
password = "xxxxxxxx"
login_obj = self.obj_metcho()
title = self.driver.title
print("登錄前title:{0}".format(title))
url = self.driver.current_url
print("登錄前url:{0}".format(url))
driver = login_obj.login_curres(username,password)
driver.switch_to_default_content()
sleep(5)
url = self.driver.current_url
print("登錄成功后url:{0}".format(url))
print("登錄成功后的title:{0}".format(self.driver.title))
self.result = self.by_id("//span[@id='spnUid']").text
self.assertTrue(username in self.result)
def test_bwrite(self):
'''寫郵件輸入收件人、主題、正文'''
driver = self.driver
#點擊左上角的寫信按鈕
self.by_id("//*[@id='dvNavTop']/ul/li[2]/span[2]").click()
sleep(5)
#輸入收件人email地址
self.by_id("//*[@role='combobox']").send_keys("352932341@qq.com")
sleep(5)
#選中主題文本,輸入主題內容;
self.by_id("//input[@class='nui-ipt-input' and @type='text' and @maxlength='256']").click()
self.by_id("//input[@class='nui-ipt-input' and @type='text' and @maxlength='256']").send_keys("我是自動化測試發郵件給你的啊")
#主題第二種定位方式
# self.by_id(".//*[@class='bz0']/div[1]/input[@class='nui-ipt-input']").click()
# self.by_id(".//*[@class='bz0']/div[1]/input[@class='nui-ipt-input']").send_keys("我是自動化發給你的郵件謝謝你光臨")
sleep(5)
#定位到正文iframe中
class_name = self.by_id("//*[@class='APP-editor-iframe']")
driver.switch_to_frame(class_name)
driver.find_element_by_tag_name("body").send_keys("hi,all 各位小伙伴本次ui自動化測試通過了")
# .//*[@class='jp0']/div[1]/span[2]
driver.switch_to_default_content()
self.by_id("//*[@class='jp0']/div[1]/span[2]").click()
sleep(10)
text = self.by_id("//*[@class='tK1' and @role='tooltip']").text
self.assertIn(text, "發送成功可用手機接收回復免費短信通知")
def test_csend_mail(self):
'''只填寫收件人發送郵件'''
#點擊繼續寫信
self.by_id("//*[@class='py1']/a[3]").click()
#輸入收件人郵箱
self.by_id("//*[@class='bz0']/div[2]/div[1]/input").send_keys("352932341@qq.com")
sleep(5)
#點擊發送按鈕
self.by_id("//*[@class='jp0']/div[1]/span[2]").click()
sleep(5)
#確定不輸入主題和正文的彈窗
self.by_id("//*[@class='nui-msgbox-ft-btns']/div[1]/span").click()
sleep(5)
text =self.by_id("//*[@class='sQ1']/h1").text
self.assertIn("發送成功",text)
def test_dsend_mail(self):
'''只填寫收件人與主題發送'''
self.by_id("//*[@class='py1']/a[3]").click() #點擊繼續寫信
# self.by_id("//*[@id='dvNavTop']/ul/li[2]/span[2]").click() #直接登錄后,點擊寫信
#輸入收件人郵箱
self.by_id("//*[@class='bz0']/div[2]/div/input").send_keys("352932341@qq.com")
sleep(5)
#輸入主題
self.by_id("//*[@class='nui-ipt-input' and @maxlength='256']").click()
self.by_id("//*[@class='nui-ipt-input' and @maxlength='256']").send_keys("我只輸入的主題沒有輸入正文")
sleep(5)
#點擊發送按鈕
self.by_id("//*[@class='jp0']/div[1]/span[2]").click()
sleep(5)
#獲取發送成功后的文本信息
text = self.by_id("//*[@class='sQ1']/h1").text
self.assertIn("發送成功",text)
def test_esend_mail(self):
'''輸入收件人、主題、附件'''
self.by_id("//*[@class='py1']/a[3]").click() #點擊繼續寫信
#下面代碼是,重新登錄進入的
# self.by_id("//*[@id='dvNavTop']/ul/li[2]/span[2]").click()
#輸入收件人郵箱
sleep(5)
self.by_id("//*[@class='bz0']/div[2]/div/input").send_keys("352932341@qq.com")
sleep(5)
#輸入主題
self.by_id("//*[@class='nui-ipt-input' and @maxlength='256']").click()
self.by_id("//*[@class='nui-ipt-input' and @maxlength='256']").send_keys("我輸入了主題且添加了附件")
#添加上傳附件
self.by_id("//*[@class='O0']").send_keys("E:\\test_email.txt")
sleep(5)
#點擊發送按鈕
self.by_id("//*[@class='jp0']/div[1]/span[2]").click()
sleep(5)
#獲取發送成功后的文本信息
text =self.by_id("//*[@class='sQ1']/h1").text
self.assertIn("發送成功",text)
def test_clogin(self):
'''退出登錄'''
logout_text = "您已成功退出網易郵箱。"
self.obj_metcho().logout()
sleep(10)
self.result = self.by_id("html/body/section/h1").text
self.assertEqual(logout_text,self.result)
def by_id(self,the_id):
return self.driver.find_element_by_xpath(the_id)
def tearDownClass(cls):
'''關閉瀏覽器'''
cls.driver.quit()
test_bserach.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
from login import Login_Case
class Serach_email(unittest.TestCase):
driver = webdriver.Chrome()
@classmethod
def setUpClass(cls):
cls.driver.maximize_window()
base_url ="http://mail.126.com/"
cls.driver.get(base_url)
sleep(10)
def obj_metcho(self):
'''實例化Login_Case類'''
obj=Login_Case(Serach_email.driver)
return obj
#登錄126.com郵箱
def test_alogin_succer(self):
user_name = "test_tx"
password = "123456tian"
login_obj = self.obj_metcho()
driver = login_obj.login_curres(user_name,password)
driver.switch_to_default_content()
sleep(10)
self.result = self.by_id("//*[@id='spnUid']").text
self.assertTrue(user_name in self.result)
def test_bserach_content(self):
'''輸入關鍵值點擊搜索'''
sleep(5)
self.by_id("//*[@class='nui-ipt-input' and @type='text']").clear()
self.by_id("//*[@class='nui-ipt-input' and @type='text']").send_keys("重置成功")
self.by_id("//*[@class='nui-ipt-input' and @type='text']").send_keys(Keys.ENTER)
sleep(10)
self.result =self.by_id("//*[@class='tb0']/div/span").text
print("self_result是多少啊",self.result)
self.assertIn("重置成功",self.result)
def test_cnot_serach(self):
'''輸入關鍵字不存在'''
sleep(5)
self.by_id("//*[@class='nui-ipt-input' and @type='text']").clear()
self.by_id("//*[@class='nui-ipt-input' and @type='text']").send_keys("在哪了啊")
self.by_id("//*[@class='nui-ipt-input' and @type='text']").send_keys(Keys.ENTER)
sleep(10)
self.result = self.by_id("//*[@class='rm1']").text
self.assertIn("抱歉,沒有搜索到",self.result)
def test_dlogout(self):
'''退出登錄'''
logout_text = "您已成功退出網易郵箱。"
self.obj_metcho().logout()
sleep(10)
self.result = self.by_id("html/body/section/h1").text
self.assertEqual(logout_text,self.result)
def by_id(self,the_id):
return self.driver.find_element_by_xpath(the_id)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
test_cdel.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
import unittest
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from time import sleep
from login import Login_Case
class DeletEmail(unittest.TestCase):
''' 刪除郵件'''
driver = webdriver.Chrome()
@classmethod
def setUpClass(cls):
driver = cls.driver
driver.maximize_window()
base_url = "http://mail.126.com/"
driver.get(base_url)
sleep(10)
def obj_methond(self):
obj = Login_Case(DeletEmail.driver)
return obj
#登錄126郵箱
def test_alogin(self):
username = "test_tx"
password = "123456tian"
obj_driver = self.obj_methond()
driver = obj_driver.login_curres(username,password)
driver.switch_to_default_content()
sleep(10)
self.result = self.by_id("//*[@id='spnUid']").text
self.assertTrue(username in self.result)
@StopIteration
def test_bdelete_email(self):
'''刪除郵件'''
sleep(5)
self.driver.find_element_by_class_name("nui-tree-item-text").click()
sleep(3)
self.driver.find_elements_by_xpath("//span[@class='nui-chk-symbol']/b").pop(1).click()
sleep(5)
try:
spans = self.driver.find_elements_by_tag_name('span')
for i in spans:
if i.text =="刪 除":
i.click()
except Exception as e:
print("找不到刪除按鈕")
sleep(3)
#斷言是否已刪除
text = self.driver.find_element_by_css_selector("span.nui-tips-text>a").text
self.assertEqual(text,'已刪除')
def test_logout(self):
'''退出登錄'''
logout_text = "您已成功退出網易郵箱。"
self.obj_methond().logout()
sleep(10)
self.result = self.by_id("html/body/section/h1").text
self.assertEqual(logout_text,self.result)
def by_id(self,the_id):
return self.driver.find_element_by_xpath(the_id)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
2、Wordpress 登錄 成功 和 登錄失敗
test_login_case.py
from selenium import webdriver
from time import sleep
import unittest
class TestCase(unittest.TestCase):
driver = webdriver.Chrome()
@classmethod
def setUpClass(cls):
driver = cls.driver
base_url = "http://localhost/wordpress/wp-login.php"
driver.get(base_url)
sleep(5)
def test_eoagin_success(self):
'''登錄成功'''
#Arrang 准備測試數據
user_name = "admin"
password = "123456"
loging_succeed_url = "wp-admin"
sleep(5)
#Action 執行測試步驟
self.by_xpath("//input[@id='user_login']").clear()
self.by_xpath("//input[@id='user_login']").send_keys(user_name)
self.by_xpath("//input[@id='user_pass']").clear()
self.by_xpath("//input[@id='user_pass']").send_keys(password)
self.by_xpath("//input[@id='wp-submit']").click()
sleep(5)
#Assert 斷言
self.assertTrue(loging_succeed_url in self.driver.current_url) #登錄成功后頁面發生跳轉后,斷言url中是否wp-admin
print("斷言1 登錄成功跳轉url:{0}".format(self.driver.current_url))
#Assert 斷言2 登錄成功后斷言右上角是否存在admin
greek_link=self.by_css("#wp-admin-bar-my-account >.ab-item").text
print("斷言2 greek_link:{0}".format(greek_link))
self.assertTrue(user_name in greek_link)
def test_ausername_passwor_all_null(self):
'''用戶名和密碼為空'''
#Action
self.by_css("#user_login").send_keys()
self.by_css("#user_pass").send_keys()
self.by_css("#wp-submit").click()
#Assert 斷言
self.assertTrue("wordpress/wp-login.php" in self.driver.current_url)
def test_buser_password_null(self):
'''輸入正確用戶名,密碼為空'''
#Arrang 准備測試數據
username ="admin"
login_error ="錯誤:密碼一欄為空。"
#Action 執行測試步驟
self.by_css("#user_login").send_keys(username)
self.by_css("#user_pass").send_keys()
self.by_css("#wp-submit").click()
#Assert 斷言
mesage_error = self.by_css("#login_error").text
self.assertTrue(login_error in mesage_error)
def test_cuser_password_error(self):
'''正確的用戶名,錯誤的密碼'''
#Arrang 准備測試數據
sleep(3)
username = "admin"
password ="adafdanfn"
login_error = "錯誤:admin 的密碼不正確。"
#Action 執行測試步驟
self.by_css("#user_login").clear()
self.by_css("#user_login").send_keys(username)
self.by_css("#user_pass").send_keys(password)
self.by_css("#wp-submit").click()
#Assert 斷言
mesage_error = self.by_css("#login_error").text
self.assertTrue(login_error in mesage_error)
def test_duserpassword_error(self):
'''用戶名錯誤,密碼錯誤'''
#Arrang 准備測試數據
sleep(3)
username = "amdinjj"
password = "112344"
login_error ="錯誤:無效用戶名。"
#Action 執行測試步驟
self.by_css("#user_login").clear()
self.by_css("#user_login").send_keys(username)
self.by_css("#user_pass").send_keys(password)
self.by_css("#wp-submit").click()
#Assert 斷言
message_error = self.by_css("#login_error").text
self.assertTrue(login_error in message_error)
def by_xpath(self,the_xpath):
return self.driver.find_element_by_xpath(the_xpath)
def by_css(self,the_css):
return self.driver.find_element_by_css_selector(the_css)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
if __name__ == '__main__':
unittest.main()
3、創建文章
from selenium import webdriver
from time import sleep
import unittest,time
from selenium.webdriver.common.action_chains import ActionChains
class Login_Case(unittest.TestCase):
driver = webdriver.Chrome()
user_name ='admin'
password ="123456"
@classmethod
def setUpClass(cls):
driver=cls.driver
base_url = "http://localhost/wordpress/wp-login.php"
driver.get(base_url)
def test_alogin(self):
'''登錄成功'''
self.login(self.user_name,self.password)
self.assertTrue("wp-admin" in self.driver.current_url)
greeting_link = self.by_css("#wp-admin-bar-my-account > .ab-item")
self.assertTrue(self.user_name in greeting_link.text)
def test_create_post(self):
self.login_as_admin()
self.driver.get("http://localhost/wordpress/wp-admin/post-new.php")
sleep(5)
title ='This is my post for py se 10 %s' %(time.time())
self.by_css("#title").send_keys(title)
self.set_content('post body') #參數為正文內容post body
self.by_css("#publish").click()
self.driver.get("http://localhost/wordpress/wp-admin/edit.php")
sleep(10)
new_post_tite = self.by_css('.row-title').text
self.assertTrue(new_post_tite == title)
def set_content(self,text):
'''固定格式'''
js = 'document.getElementById("content_ifr").contentWindow.document.body.innerHTML="%s"' %(text)
print("js是:{0}".format(js))
self.driver.execute_script(js)
def login_as_admin(self):
self.login(self.user_name,self.password)
def login(self,user,passwd):
'''登錄方法'''
sleep(5)
self.by_css("#user_login").send_keys(user)
self.by_css("#user_pass").send_keys(passwd)
self.by_css("#wp-submit").click()
def test_blogout(self):
'''退出'''
sleep(5)
above=self.by_xpath("//*[@id='wp-admin-bar-my-account']/a")
#對定位的元素執行懸停操作
ActionChains(self.driver).move_to_element(above).perform()
sleep(5)
self.by_xpath(".//*[@id='wp-admin-bar-logout']/a").click()
sleep(5)
def by_xpath(self,th_xpath):
return self.driver.find_element_by_xpath(th_xpath)
def by_css(self,th_css):
return self.driver.find_element_by_css_selector(th_css)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
if __name__ == '__main__':
unittest.main()
4、將qq.com首頁上的今日話題的內容自動發表到自己的blog
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
class QQDailyHot:
def __init__(self):
self.driver = webdriver.Chrome()
self.title,self.content = self.get_title_and_content_from_daily_hot()
self.username = 'admin'
self.password = "123456"
def get_daily_hot_url(self):
return self.by_css("#todaytop >a").get_attribute('href')
def get_title_and_content_from_daily_hot(self):
self.driver.get("http://www.qq.com/")
url = self.get_daily_hot_url()
sleep(5)
self.driver.get(url)
sleep(10)
title = self.by_xpath("//h2[@id='sharetitle']").text
print("title是:{0}".format(title)) #innerHTML獲取標簽之間的HTML
content = self.by_xpath(".//*[@id='articleContent']").get_attribute('innerHTML') #獲取id=articleContent直接所有的標簽;
print("content:{0}".format(content))
return title,content
def quit(self):
'''退出'''
self.driver.quit()
def create_post_from_daily_hot(self):
self.driver.get("http://localhost/wordpress/wp-login.php")
self.login_as_admin()
self.driver.get("http://localhost/wordpress/wp-admin/post-new.php")
sleep(5)
self.by_css("#title").send_keys(self.title)
self.set_content(self.content)
sleep(10)
self.by_xpath("//*[@id='publish']").click()
def set_content(self,text):
text = text.strip()
js = 'document.getElementById("content_ifr").contentWindow.document.body.innerHTML=\'%s\'' %(text)
print(js)
self.driver.execute_script(js)
def login_as_admin(self):
'''登錄'''
sleep(5)
self.by_xpath("//*[@id='user_login']").send_keys(self.username)
self.by_xpath(".//*[@id='user_pass']").send_keys(self.password)
self.by_xpath("//*[@id='wp-submit']").click()
def by_css(self,the_css):
return self.driver.find_element_by_css_selector(the_css)
def by_xpath(self,the_xpath):
return self.driver.find_element_by_xpath(the_xpath)
if __name__ == '__main__':
datly_hot = QQDailyHot()
datly_hot.create_post_from_daily_hot()
datly_hot.quit()
5、實現創建post的數據驅動
json_data.py 數據文件
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
import json
class Json_Data:
def data(self):
data = [
{
'title': "Don't cry because it's over, smile because it happened",
'content': "Don"
},
{
'title': "Be yourself; everyone else is already taken",
'content': "Be"
},
{
'title': 'So many books, so little time',
'content': 'So'
}
]
return json.dumps(data)
test_json_data.py 實現代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
import json
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
from json_data import Json_Data
class Reat_dict:
def __init__(self):
self.driver = webdriver.Chrome()
self.base_url = "http://localhost/wordpress/wp-login.php"
self.user = "admin"
self.password ="123456"
self.obj_data = Json_Data()
self.data = self.data_dict()
def data_dict(self):
resutl_data = self.obj_data.data()
return json.loads(resutl_data)
def login(self):
'''登錄'''
sleep(10)
self.by_xpath("//*[@id='user_login']").send_keys(self.user)
self.by_xpath("//*[@id='user_pass']").send_keys(self.password)
self.by_xpath("//*[@id='wp-submit']").click()
def test_creatnew_Wordpress(self):
self.driver.get(self.base_url)
self.login()
sleep(5)
for line in self.data:
self.driver.get("http://localhost/wordpress/wp-admin/post-new.php")
title = line['title']
sleep(5)
self.by_xpath("//*[@id='title']").send_keys(title)
content_1 = line['content']
sleep(5)
self.set_content(content_1)
sleep(5)
self.by_css("#publish").click()
def set_content(self,text):
text = text.strip()
js = 'document.getElementById("content_ifr").contentWindow.document.body.innerHTML=\'%s\'' %(text)
self.driver.execute_script(js)
def by_xpath(self,the_xpath):
return self.driver.find_element_by_xpath(the_xpath)
def by_css(self,the_css):
return self.driver.find_element_by_css_selector(the_css)
def logout(self):
'''退出登錄'''
above = self.by_xpath("//*[@id='wp-admin-bar-my-account']/a")
ActionChains(self.driver).move_to_element(above).perform()
sleep(5)
self.by_xpath("//*[@id='wp-admin-bar-logout']/a").click()
def quit(self):
self.driver.quit()
if __name__ == '__main__':
obj = Reat_dict()
obj.test_creatnew_Wordpress()
obj.login()
obj.logout()
obj.quit()
6、粉絲反饋表單自動化腳本:
需求:
- 服務質量5顆星
- 喜歡的內容選擇各種公開課
- 對交流群的意見需要填寫
- 留下自己正確的聯系方式
- 點擊提交
- 不需要斷言,能提交成功就可以
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
class Fans_Table:
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
base_url = "https://jinshuju.net/f/kRXoEv"
self.driver.get(base_url)
sleep(5)
self.test_fans_home()
def test_fans_home(self):
result=self.by_sxpaths(".//*[@class='selectable type-star']/i")
for i in result:
if not i.is_selected():
i.click()
sleep(5)
self.by_scss(".choices.font-family-inherit>label").pop(1).click()
self.by_css("#entry_field_3").send_keys("我希望可以學到更多的知識")
sleep(5)
self.by_css("#entry_field_4").send_keys("135623@qq.com")
js ="window.scrollTo(1903,1166)" #提交按鈕在底部,需要設置分辨率
self.driver.execute_script(js) #豎滾單條
sleep(5)
self.by_xpath("//*[@id='new_entry']/div[3]/div/div[2]/input[1]").click()
def by_xpath(self,the_xpath):
return self.driver.find_element_by_xpath(the_xpath)
def by_sxpaths(self,the_xps):
return self.driver.find_elements_by_xpath(the_xps)
def by_css(self,the_css):
return self.driver.find_element_by_css_selector(the_css)
def by_scss(self,the_scss):
return self.driver.find_elements_by_css_selector(the_scss)
if __name__ == '__main__':
obj = Fans_Table()
7、百度天氣
test_baidu_weather.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
class WeatherNotification:
def __init__(self,city):
self.driver = webdriver.Chrome()
self.goto_weather_page(city)
def goto_weather_page(self,cityname):
keyword = cityname + '天氣'
self.driver.get("https://www.baidu.com/")
self.by_css("#kw").send_keys(keyword)
wait = WebDriverWait(self.driver,5) #隱式等待,參數5為設置等待時間,默認每隔0.5秒檢測元素是否存在
wait.until(lambda dr: dr.find_element_by_class_name('op_weather4_twoicon_container_div').is_displayed())
@property
def tomorrow_block(self):
result=self.driver.find_element_by_class_name('op_weather4_twoicon_day')
return result
def quit(self):
self.driver.quit()
def send_email(self,email,content):
print('Send email"%s'%(content))
def get_temperature(self):
tmp_txt = self.by_css(".op_weather4_twoicon_temp").text
print("tmp_txt等於",tmp_txt)
high_temp = tmp_txt.replace("℃",'').split('~')[-1].strip()
print("hight_tmep",high_temp)
return int(high_temp)
def get_weather(self):
wt_txt = self.tomorrow_block.find_element_by_class_name("op_weather4_twoicon_weath").text
print("wt_txt等於",wt_txt)
if '雨' in wt_txt:
return 'raining'
else:
return 'not raining'
def send_notification(self,email):
weather = self.get_weather()
print("weather等於",weather)
temmperature = self.get_temperature()
print("temmperature等於:",temmperature)
content = ''
if weather == 'raining':
content += '明天下雨'
else:
content += '明天晴天'
print("content是什么啊",content)
if temmperature < 10:
content +="溫度低於10度,請注意保暖"
if temmperature >30:
content +="溫度高於30度,請注意高溫"
self.quit()
print("最后的content是什么",content)
def by_xpath(self,the_xpath):
return self.driver.find_element_by_xpath(the_xpath)
def by_css(self,the_css):
return self.driver.find_element_by_css_selector(the_css)
if __name__ == '__main__':
obj = WeatherNotification("深圳")
obj.send_notification('xxooxxww@qq.com')
8、wordpress刪除文章
test_deleter.py
#!/usr/bin/env python # -*- coding:utf-8 -*- # author:tian from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep import time import unittest class TestCase(unittest.TestCase): driver = webdriver.Chrome() @classmethod def setUpClass(cls): base_url ="http://localhost/wordpress/wp-login.php" cls.driver.get(base_url) cls.driver.maximize_window() cls.driver.implicitly_wait(5) def login(self): '''登錄''' user_name ='admin' passwrod ='123456' self.by_css("#user_login").send_keys(user_name) self.by_css("#user_pass").send_keys(passwrod) self.by_css("#wp-submit").click() def test_aCeate_post(self): '''創建帖子''' self.login() title = "我是來測試帖子的:{0}".format(time.time()) content = "post data" self.creat_post(title,content) sleep(3) self.goto_posts_list_page() new_post_title = self.by_css(".row-title").text self.assertTrue(new_post_title == title) def test_bdelete_post(self): '''刪除帖子''' title = "測試發帖發完后我又刪除了:{0}".format(time.time()) content = "post data delete" post_id = self.creat_post_and_return_its_id(title,content) self.goto_posts_list_page() row_id = "post-{0}".format(post_id) new_post_row = self.by_id(row_id) ActionChains(self.driver).move_to_element(new_post_row).perform() new_post_row.find_element_by_css_selector("a.submitdelete").click() sleep(3) self.logout() def creat_post_and_return_its_id(self,title,content): self.creat_post(title,content) return self.by_id("sample-permalink").text.split("=")[-1] #返回發帖的id def creat_post(self,title,content): '''輸入帖子title和內容,點擊創建''' self.driver.get("http://localhost/wordpress/wp-admin/post-new.php") self.by_css("#title").send_keys(title) self.set_content(content) sleep(3) self.by_css("#publish").click() def set_content(self,text): js = 'document.getElementById("content_ifr").contentWindow.document.body.innerHTML="%s"' %(text) self.driver.execute_script(js) def goto_posts_list_page(self): self.driver.get("http://localhost/wordpress/wp-admin/edit.php") sleep(3) def logout(self): '''退出登錄''' move_element = self.by_xpath("//*[@id='wp-admin-bar-my-account']/a") ActionChains(self.driver).move_to_element(move_element).perform() sleep(5) self.by_xpath(".//*[@id='wp-admin-bar-logout']/a").click() text ="您已登出。" result =self.by_css(".message").text.strip() self.assertTrue(text==result) def by_xpath(self,the_xpath): return self.driver.find_element_by_xpath(the_xpath) def by_css(self,the_css): return self.driver.find_element_by_css_selector(the_css) def by_id(self,the_id): return self.driver.find_element_by_id(the_id) @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == '__main__': unittest.main()
9、知乎(完成一半代碼)
zhiu.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
from selenium import webdriver
from datetime import date
class ZhiHu:
def __init__(self):
self.daily_url = 'https://www.zhihu.com/explore#daily-hot'
self.monthly_url = 'https://www.zhihu.com/explore#monthly-hot'
self.dr = webdriver.Chrome()
def get_daily_hots_urls(self):
self.dr.get(self.daily_url)
self.dr.maximize_window()
self.dr.implicitly_wait(5)
wrap_div = self.by_css(".tab-panel")
title_url_elements = wrap_div.find_elements_by_css_selector(".question_link")
assert len(title_url_elements) == 5
urls =[]
for title in title_url_elements:
urls.append(title.get_attribute('href'))
return urls
def get_daily_hots(self):
result = []
hots_urls = self.get_daily_hots_urls()
for url in hots_urls:
result.append(self.get_answer(url))
return result
def get_answer(self,url):
self.dr.get(url)
article = {}
article['question'] = self.by_xpath(".//*[@id='root']/div/main/div/div[1]/div[2]/div[1]/div[1]/h1").text #提問的問題
article['author'] = self.by_xpath(".//*[@id='root']/div/main/div/div[2]/div[1]/div[2]/div/div/div[1]/div/div[1]/div/div[1]").text #作者
article['answer'] = self.by_css(".RichContent-inner").get_attribute('innerHTML') #回答的正文
return article
def by_css(self,the_css):
return self.dr.find_element_by_css_selector(the_css)
def by_xpath(self,the_xpath):
return self.dr.find_element_by_xpath(the_xpath)
def by_elements_css(self,thes_css):
return self.dr.find_elements_by_css_selector(thes_css)
class ZhihuReporter:
def __init__(self,path):
self.report_path = path
self.open_file = open(path,'w+',encoding="utf-8")
def write_body(self):
self.open_file.write('''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css">
<title>Title</title>
</head>
<body>
<h3>知乎{0}最熱</h3>
'''.format(date.today().strftime("%Y_%m_%d")))
def write_article(self,articles):
# self.open_file.write('知乎%s最熱</h3>' %(date.today().strftime("%Y_%m_%d")))
for article in articles:
# article_html = '<h3>%s<small>%s</small></h3>' %(article['question'], article['author'])
# article_html += article['answer']
self.open_file.write('''
<div class="container>
<h3>{0}<small>{1}</small></h3>
{2}
</div><hr>
'''.format(article['question'],article['author'],article['answer']))
# self.open_file.write(article)
self.open_file.write('''
</body>
</html>
''')
def build_articel_report(self,articles):
self.write_body()
self.write_article(articles)
self.open_file.close()
if __name__ == '__main__':
obj = ZhiHu()
articles = obj.get_daily_hots()
report_name ='zhihu_{0}.html'.format(date.today().strftime('%Y_%m_%d'))
reporter = ZhihuReporter(report_name)
reporter.build_articel_report(articles)
10、登錄http://www.smzdm.com/,點擊簽到積分按鈕,獲取每日積分
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import sleep
class TestCase:
def __init__(self,username,password):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
self.base_url = "http://www.smzdm.com/"
self.driver.get(self.base_url)
self.username = username
self.password = password
def loging(self):
self.by_css("#skip-step").click()
self.by_css(".nav-logins .J_login_trigger").click()
sleep(2)
login_div=self.by_css("#J_login_popup")
assert login_div.is_displayed(),'登錄框未顯示'
login_frame = self.by_css("#J_login_iframe")
self.driver.switch_to_frame(login_frame)
self.by_css("#username").click()
self.by_css("#username").send_keys(self.username)
self.by_css("#password").click()
self.by_css("#password").send_keys(self.password)
sleep(2)
self.by_css("#login_submit").click()
self.driver.switch_to_default_content()
def get_integral(self):
sleep(5)
try:
score_btn = self.by_css(".J_punch")
assert score_btn.is_displayed(),'積分按鈕未顯示'
self.by_css(".J_punch").click()
sleep(3)
assert score_btn.get_attribute("class")=="J_punch"
print("點擊積分按鈕",score_btn.text)
except NoSuchElementException:
score_btn = self.by_css(".J_punch").text
print("未找到積分按鈕:{0}".format(score_btn))
def logout(self):
'''退出登錄'''
sleep(5)
obj_mover=self.by_css(".nav-username.J_nav_username")
ActionChains(self.driver).move_to_element(obj_mover).perform()
self.by_xpath(".//*[@id='global-nav']/div/div/ul/li[3]/ul/li[12]/a").click()
sleep(2)
home_test=self.by_css(".nav-logins").text
print("退出登錄到首頁:{0}".format(home_test))
self.driver.quit()
def by_css(self,the_css):
return self.driver.find_element_by_css_selector(the_css)
def by_xpath(self,the_xpath):
return self.driver.find_element_by_xpath(the_xpath)
if __name__ == '__main__':
username = "135******620"
password = "**********"
obj = TestCase(username,password)
obj.loging()
obj.logout()
11、試吃報名:https://jinshuju.net/f/kl2yl3
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:tian
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import sleep
from selenium.webdriver.support.ui import Select #下拉菜單進行定位
class TestCase:
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
self.base_url = "https://jinshuju.net/f/kl2yl3"
self.driver.get(self.base_url)
self.list_table = {"weixing":"352932341","name":"張帥","phone":13580453523,"email":"xxoosss@qq.com","age":12}
def post_table(self):
self.by_css("#entry_field_1").click()
self.by_css("#entry_field_1").send_keys(self.list_table['weixing'])
self.by_css("#entry_field_2").click()
self.by_css("#entry_field_2").send_keys(self.list_table['name'])
self.by_css("#entry_field_3").click()
self.by_css("#entry_field_3").send_keys(self.list_table['phone'])
self.by_css("#entry_field_4").click()
self.by_css("#entry_field_4").send_keys(self.list_table['email'])
self.by_css("#entry_field_5").click()
self.by_css("#entry_field_5").send_keys(self.list_table['age'])
Select(self.by_css("#entry_field_6_province")).select_by_value("廣東省")
sleep(2)
Select(self.by_css("#entry_field_6_city")).select_by_value("深圳市")
sleep(2)
Select(self.by_css("#entry_field_6_district")).select_by_value("福田區")
sleep(2)
self.by_css("#entry_field_6_street").send_keys("大石鎮130號")
sleep(2)
self.by_xpath(".//*[@id='new_entry']/div[3]/div/div[1]/div[7]/div/div[2]/div/label[2]").click()
sleep(2)
# self.by_xpath(".//*[@id='new_entry']/div[3]/div/div[1]/div[8]/div/div[2]/div/label[1]/div[1]/i").click()
obj_select=self.driver.find_elements_by_css_selector(".choice-description")
for line in obj_select:
if line.text.strip() =="周期長":
line.click()
else:
pass
sleep(2)
self.by_css("#entry_field_9").click()
self.by_css("#entry_field_9").send_keys("互聯網上")
def by_css(self,the_css):
return self.driver.find_element_by_css_selector(the_css)
def by_xpath(self,the_xpath):
return self.driver.find_element_by_xpath(the_xpath)
if __name__ == '__main__':
obj = TestCase()
obj.post_table()