【测试基础04】

测试基础02

  • 一、HTML基础
  • 二、Python导入三方模块
  • 三、安装webgrock驱动
  • 四、元素定位
    • (1)、元素定位工具
    • (2)、元素定位方式
    • (3)、XPATH路径
    • (3)、CSS选择器
  • 五、Selenium WebDriver初步应用
    • (1)、基本方法
    • (2)、测试案例1
    • (3)、测试案例2
    • (3)、测试案例3
  • 六、获取元素信息的方法
  • 七、frame表单切换
  • 八、UnitTest框架
    • (1)、核心要素
    • (2)、使用方法
  • 九、断言
  • 十、综合测试案例

一、HTML基础

在python里面创建一个html文件
【测试基础04】_第1张图片

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>网页标签</title>
</head>
<body>
网页内容
<br>
<input id="u2" maxlength="8" name="w2" type="text">
<br>
<a href="http://www.baidu.com">百度</a>
</body>
</html>

然后可以在浏览器输入其html文件地址就可以看到网页信息
【测试基础04】_第2张图片

二、Python导入三方模块

1、dos命令安装selenium
【测试基础04】_第3张图片
使用pip show selenium可以查看当前是否下载成功
【测试基础04】_第4张图片

2、python添加selenium
查看设置
【测试基础04】_第5张图片
可以看安装库里面有没有selenium,有安装的话可以查看版本。没有的话可以选择➕号,搜索selenium并添加到库。
【测试基础04】_第6张图片

三、安装webgrock驱动

下载firefox浏览器驱动
注意查看firefox的版本,浏览器驱动的版本要和python的selenium的版本对应。

https://github.com/mozilla/geckodriver/releases/

链接: https://github.com/mozilla/geckodriver/releases/
找到自己的系统环境变量,复制位置
【测试基础04】_第7张图片
将刚刚下载好的驱动放到复制的地址当中即可,这样对于py的命令,电脑系统就找到浏览器驱动并自动使用。
要是嫌上面操作麻烦,也可以直接将浏览器驱动放到做Python做自动化测试的项目里面。
【测试基础04】_第8张图片

四、元素定位

(1)、元素定位工具

F12进入代码查看,按照以下步骤即可查看元素定位
【测试基础04】_第9张图片

(2)、元素定位方式

selenium提供了8种定位方式

id                 --元素属性
name               --元素属性
class_name         --元素属性
tag_name           --标签                 ##注意网页中可能会有多个标签
link_text          --超链接               ##对应网页中的

使用方法

xx=driver.find_element(By.ID,'id')
xx=driver.find_element(By.name,'name')
xx=driver.find_element(By.class_name,'class_name')
xx=driver.find_element(By.tag_name,'tag_name')
xx=driver.find_element(By.link_text ,'link_text ')

(3)、XPATH路径

1、使用绝对路径即可找到元素
以下为html代码

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>网页标签title>
head>
<body>
网页内容
<br>
<input id="u2" maxlength="8" name="w2" type="text">
<br>
<a href="http://www.baidu.com">百度a>
body>
html>

【测试基础04】_第10张图片
2、使用相对路径+其他元素进行定位
以下为html代码

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>网页标签title>
head>
<body>
网页内容
<br>
<input id="u2" maxlength="8" name="w2" type="text">
<br>
<a href="http://www.baidu.com">百度a>
body>
html>

假如要找到文本为百度的超链接,可以使用绝对路径加+元素属性

//a[@href='http://www.baidu.com'][contains(text(),'百度')]

//a代表所有a节点,@href=‘http://www.baidu.com’]代表匹配超链接地址,[contains(text(),‘百度’)]代表匹配文本为百度的,三者并列去寻找元素。
【测试基础04】_第11张图片

(3)、CSS选择器

id选择:#id
class选择:.class
元素选择器:[元素=‘’属性]

举例id属性
【测试基础04】_第12张图片
举例
【测试基础04】_第13张图片

五、Selenium WebDriver初步应用

(1)、基本方法

1、导入Selenium模块

from selenium import webdriver

2、新建对象、并启动浏览器

from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()                

3、调用maximize_window()窗口最大化

from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize()                窗口最大化

4、调用get()方法打开一个网页

from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")        打开网页

4、清理文本

from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")
driver.get("http://account.ryjiaoyu.com/log-in").clear()
6、调用send_keys输入文本
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")
driver.get("http://account.ryjiaoyu.com/log-in").clear()               清理文本

5、输入内容

from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")
driver.get("http://account.ryjiaoyu.com/log-in").clear()
6、调用send_keys输入文本
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")
driver.get("http://account.ryjiaoyu.com/log-in").clear()               清理文本
driver.find_element(By.XPATH,"//input[@id='Email']").send_keys('xxx')
driver.find_element(By.XPATH,"//input[@id='Password']").clear()
driver.find_element(By.XPATH,"//input[@id='Password']").send_keys('xxx')

6、通过click()点击操作

from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")
driver.get("http://account.ryjiaoyu.com/log-in").clear()
6、调用send_keys输入文本
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")
driver.get("http://account.ryjiaoyu.com/log-in").clear()               清理文本
driver.find_element(By.XPATH,"//input[@id='Email']").send_keys('xxx')
driver.find_element(By.XPATH,"//input[@id='Password']").clear()
driver.find_element(By.XPATH,"//input[@id='Password']").send_keys('xxx')
driver.find_element(By.XPATH,"//input[@value='登 录']").click()       登录

7、导入time模块

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")
time.sleep(3)                                                                                等待3秒
driver.get("http://account.ryjiaoyu.com/log-in").clear()               清理文本
driver.find_element(By.XPATH,"//input[@id='Email']").send_keys('xxx')
driver.find_element(By.XPATH,"//input[@id='Password']").clear()
driver.find_element(By.XPATH,"//input[@id='Password']").send_keys('xxx')
driver.find_element(By.XPATH,"//input[@value='登 录']").click()       登录

8、关闭浏览器

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver=webdriver.Firefox()
driver.maximize()
driver.get("http://account.ryjiaoyu.com/log-in")
time.sleep(3)                                                                                等待3秒
driver.get("http://account.ryjiaoyu.com/log-in").clear()               清理文本
driver.find_element(By.XPATH,"//input[@id='Email']").send_keys('xxx')
driver.find_element(By.XPATH,"//input[@id='Password']").clear()
driver.find_element(By.XPATH,"//input[@id='Password']").send_keys('xxx')
driver.find_element(By.XPATH,"//input[@value='登 录']").click()       登录
driver.quit()                             关闭

(2)、测试案例1

利用ID对空白行进行填写
【测试基础04】_第14张图片
使用以下代码即可调用

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 获取浏览器对象
driver=webdriver.Firefox()
# 窗口最大化
driver.maximize_window()
#  get方式获取地址
driver.get("file:///E:/pythonProject/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E7%BD%91%E9%A1%B5.html")
# 等待三秒
time.sleep(3)
#  id元素定位
black=driver.find_element(By.ID,'u2')
# 填写内容
black.send_keys('123')
# 等待三秒
time.sleep(3)
# 退出
driver.quit()

(3)、测试案例2

利用超链接匹配,点击百度超链接
【测试基础04】_第15张图片

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 获取浏览器对象
driver=webdriver.Firefox()
# 窗口最大化
driver.maximize_window()
#  get方式获取地址
driver.get("file:///E:/pythonProject/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E7%BD%91%E9%A1%B5.html")
# 等待三秒
time.sleep(3)
#  id元素定位
black=driver.find_element(By.PARTIAL_LINK_TEXT,'百度')       超链接匹配百度
black.click()
# 等待三秒
time.sleep(3)

(3)、测试案例3

对网页输入10次账户和密码并登录

for i in range(1,11):
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.get("https://account.ryjiaoyu.com/log-in")
    time.sleep(3)
    driver.find_element(By.ID,'Email').clear()
    driver.find_element(By.ID, 'Email').send_keys('xxx')
    driver.find_element(By.ID,'Password').clear()
    driver.find_element(By.ID,'Password').send_keys('xxx')
    driver.find_element(By.XPATH, "//input[@value='登 录']").click()
    driver.quit()

六、获取元素信息的方法

1、size   返还元素大小
2、text   获取元素的文本
3、 get_attribute("xxx")   获取属性值,传递的参数为元素的属性名
4、is_displayed()            判断袁术是否可见
5、is)enabled()              判断元素是否可用
6、is_selected()             判断元素是否选中

注意:size、text为属性,调用时无括号;如:xxx.size

测试案例
获取输入账户框获取文本大小
获取第一个超链接的文本框内容
获取第一个超链接的地址

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 获取浏览器对象
driver=webdriver.Firefox()
# 窗口最大化
driver.maximize_window()
#  get方式获取地址
driver.get("https://account.ryjiaoyu.com/log-in")
# 等待三秒
time.sleep(3)
#获取输入账户框获取文本大小
size=driver.find_element(By.ID,'Email').size
print("文本框大小为",size)
#获取第一个超链接的文本框内容
text=driver.find_element(By.CSS_SELECTOR,'a').text
print("文本框内容为",text)
#获取第一个超链接的地址
att=driver.find_element(By.CSS_SELECTOR,'a').get_attribute('href')
print("第一个超链接的地址内容为",att)

【测试基础04】_第16张图片

七、frame表单切换

在一个页面里面有多个表单的,填写信息时需要先切换表单

driver.switch_to.default_content()        切换到默认表单
driver.switch_to.frame("myframe1")        切换到另外一个表单

八、UnitTest框架

Unittest是python自带的单元测试框架,可以解决一类事情的功能集合,可以生成测试报告。

(1)、核心要素

1、TestCase            测试用例
2、TestSuite           测试套件(加载测试案例)
3、TestRunner          运行用例
4、TestLoader          运行用例(指定模块)
5、Fixture             保证执行(一个初始化使用,一个结束使用)

(2)、使用方法

1、TestCase

1、导包: import unittest
2、定义测试类:新建测试类必须继承unittest.Testcase
3、定义测试方法:测试方法必须以test开头

例:编写求和测试函数
注意如果在类这运行,则会运行下面所有定义的函数
【测试基础04】_第17张图片
注意如果在下面定义的函数这运行,则只会运行定义的函数
【测试基础04】_第18张图片
2、TestSuite和TestRunner
多个测试用例集合在一起就是一个TestSuite,执行多个模块就是 TestRunner
使用方法1、添加指定运行的方法
这是test1里面的类和方法
【测试基础04】_第19张图片
使用 TestSuite和TestRunner调用test1里面的类和方法
【测试基础04】_第20张图片
使用方法1、添加指定运行的类
这是test2文件里面的内容
【测试基础04】_第21张图片
执行整个类的方法
【测试基础04】_第22张图片

4、TestLoader
使用TestSuite的话,对于每一个python文件都得导入,如果有100个文件则需要导入100次,过于麻烦。因此引入了TestLoader语法。
可以搜索指定目录下指定xx开头得.py文件,将其加入到测试套件
对于3个test文件和tp文件
【测试基础04】_第23张图片
【测试基础04】_第24张图片
【测试基础04】_第25张图片

【测试基础04】_第26张图片
使用调用方法,指定/data下的tp文件加入到套件
【测试基础04】_第27张图片

5、Fixture
set和tear方法在每个方法运行之前和运行之后运行,即有几个方法,就要运行几个set和tear方法

1、初始化函数:def setUp()
2、结束函数:def tearDown()

【测试基础04】_第28张图片
还可以设置类级别的fixture,可以在运行类方法之前和类方法之后运行一次。
【测试基础04】_第29张图片

九、断言

常用的
【测试基础04】_第30张图片

还要有包括的判断语法
在这里插入图片描述
【测试基础04】_第31张图片
思考,可以用对(”登录成功“,”登录成功,欢迎xx等人进入)这种进行判断。

十、综合测试案例

利用web自动化验证网站的登录模块,并校验数据库里的账户和密码是否能够成功登录。
【测试基础04】_第32张图片
【测试基础04】_第33张图片

需求文档:
1、要求使用Py的unittest模块实现自动化
1、利用py自动化实现网站的登录模块正确性验证,如果登录失败则截图保存在指定的文件夹里。
2、利用mysql里面的账户和密码进行登录,登录不了的则将截图保存在指定文件里,并以该用户的名字命名。

测试案例
【测试基础04】_第34张图片
代码
测试序列1-4,代码执行部分

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os


os.system('mkdir Loadtest1')
class Test_x1(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Firefox()
        self.driver.maximize_window()
        self.driver.get("https://account.ryjiaoyu.com/log-in")
        time.sleep(3)

    def tearDown(self) -> None:
        self.driver.quit()


    #### 账户和密码都不填
    def test_01(self):
        self.driver.find_element(By.ID, 'Email').clear()
        self.driver.find_element(By.ID, 'Email').send_keys('')
        self.driver.find_element(By.ID, 'Password').clear()
        self.driver.find_element(By.ID, 'Password').send_keys('')
        self.driver.find_element(By.XPATH, "//input[@value='登 录']").click()
        time.sleep(3)
        result1 = self.driver.find_element(By.ID,'Email-error').text
        result2 = self.driver.find_element(By.ID, 'Password-error').text
        result3=result1+result2
        print(result3)
        expect_result3 = '请输入Email/手机请输入密码'
        try:
            self.assertEqual(result3,expect_result3)
        except AssertionError:
            self.driver.get_screenshot_as_file(r'E:\pythonProject\软件测试\测试案例\Loadtest1\账户和密码都不填.png')
            raise

    #### 只填写账户

    def test_02(self):
        self.driver.find_element(By.ID, 'Email').clear()
        self.driver.find_element(By.ID, 'Email').send_keys('1232123')
        self.driver.find_element(By.ID, 'Password').clear()
        self.driver.find_element(By.ID, 'Password').send_keys('')
        self.driver.find_element(By.XPATH, "//input[@value='登 录']").click()
        time.sleep(3)
        result2 = self.driver.find_element(By.ID, 'Password-error').text
        print(result2)
        expect_result2 = '请输入密码'
        try:
            self.assertEqual(result2, expect_result2)
        except AssertionError:
            self.driver.get_screenshot_as_file(r'E:\pythonProject\软件测试\测试案例\Loadtest1\只填写账户.png')
            raise



    #### 只填写密码

    def test_03(self):
        self.driver.find_element(By.ID, 'Email').clear()
        self.driver.find_element(By.ID, 'Email').send_keys('')
        self.driver.find_element(By.ID, 'Password').clear()
        self.driver.find_element(By.ID, 'Password').send_keys('12321321')
        self.driver.find_element(By.XPATH, "//input[@value='登 录']").click()
        time.sleep(3)
        result1=self.driver.find_element(By.ID,'Email-error').text
        print(result1)
        expect_result1 = '请输入Email/手机'
        try:
            self.assertEqual(result1, expect_result1)
        except AssertionError:
            self.driver.get_screenshot_as_file(r'E:\pythonProject\软件测试\测试案例\Loadtest1\只填写密码.png')
            raise


    #### 填写账户和错误密码

    def test_04(self):
        self.driver.find_element(By.ID, 'Email').clear()
        self.driver.find_element(By.ID, 'Email').send_keys('12321')
        self.driver.find_element(By.ID, 'Password').clear()
        self.driver.find_element(By.ID, 'Password').send_keys('21321')
        self.driver.find_element(By.XPATH, "//input[@value='登 录']").click()
        time.sleep(3)
        result3=self.driver.find_element(By.XPATH,"//*[@class='validation-summary-errors col-md-offset-3 text-danger']").text
        print(result3)
        expect_result3 = '账号或密码错误'
        try:
            self.assertEqual(result3, expect_result3)
        except AssertionError:
            self.driver.get_screenshot_as_file(r'E:\pythonProject\软件测试\测试案例\Loadtest1\账户或密码错误.png')
            raise


    #### 填写正确账户和密码
    def test_05(self):
        self.driver.find_element(By.ID, 'Email').clear()
        self.driver.find_element(By.ID, 'Email').send_keys('15717002454')
        self.driver.find_element(By.ID, 'Password').clear()
        self.driver.find_element(By.ID, 'Password').send_keys('ck2624589ck')
        self.driver.find_element(By.XPATH, "//input[@value='登 录']").click()
        time.sleep(3)
        result3 = self.driver.find_element(By.ID,"new-message-count").text
        print(result3)
        expect_result3 = '新私信'
        try:
            self.assertEqual(result3, expect_result3)
        except AssertionError:
            self.driver.get_screenshot_as_file('E:\pythonProject\软件测试\测试案例\Loadtest1\正确的账户和密码登录失败截图.png')
            raise

#if __name__=='__main__':
#    unittest.main()

测试序列5,代码执行部分

###数据库数据下载,拆分
import mysql.connector
import pandas as pd
from sqlalchemy import create_engine
mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  passwd="westos",
  auth_plugin='mysql_native_password',
  database='ck'
)
df1 = pd.read_sql(sql="select name,address from ck.customers",con=mydb)
df1.to_csv('表格.csv',index=False)



###数据库账户密码登录校验部分
import unittest
from selenium import webdriver
import time
import pandas as pd
from selenium.webdriver.common.by import By


DATA = pd.read_csv('表格.csv')
class TEST_X2(unittest.TestCase):
    def test(self):
        i=-1
        while i<13:
            i=i+1
            data1 = DATA.iloc[i, 0]
            data2 = DATA.iloc[i, 1]
            driver = webdriver.Firefox()
            driver.maximize_window()
            driver.get("https://account.ryjiaoyu.com/log-in")
            driver.find_element(By.ID, 'Email').clear()
            driver.find_element(By.ID, 'Email').send_keys(f'{data1}')
            driver.find_element(By.ID, 'Password').clear()
            driver.find_element(By.ID, 'Password').send_keys(f'{data2}')
            driver.find_element(By.XPATH, "//input[@value='登 录']").click()
            time.sleep(3)
            try:
                result3 = driver.find_element(By.ID, "new-message-count").text
                driver.quit
            except:
                driver.get_screenshot_as_file(f'E:\\pythonProject\\软件测试\\测试案例\\Loadtest2\\{data1}.png')
                driver.quit()
if __name__=='__main__':
    unittest.main()

执行调用部分,可以根据需求,选择执行测试序列1-4代码,也可以选择执行测试序列5代码。

import unittest
from Loadtest1 import Test_x1
from Loadtest2 import TEST_X2
suite=unittest.TestSuite()
suite.addTest(unittest.makeSuite(Test_x1))
unittest.TextTestRunner().run(suite)

结果执行案例1-4,案例全部通过
【测试基础04】_第35张图片
结果执行案例5,失败案例全部保存在指定文件夹
【测试基础04】_第36张图片

你可能感兴趣的:(测试,python,爬虫,firefox)