Python—UI自動化完整實戰


實戰項目

均來源於互聯網

測試報告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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM