Python与Selenium是一种常见的组合,用于构建自动化测试框架和进行Web应用程序的自动化测试。下面是关于Python和Selenium框架的介绍:
1.Python: Python是一种简单易学、功能强大的编程语言,广泛应用于各个领域。它具有简洁的语法、丰富的标准库和强大的第三方库生态系统脚本和实现自动化任务变得简单和高效。
2.Selenium: Selenium是一个用于自动化Web浏览器的工具集,可用于模拟用户在浏览器中的操作。它提供了多种编程语言的客户端驱动程序,包括Python,可以与不同的浏览器(如Chrome、Firefox、Edge等)进行交互,实现自动化测试和Web应用程序的自动化。
3.Selenium WebDriver:Selenium WebDriver是Selenium的一个关键组件,它提供了一组AP),用于与浏览器进行交互和控制。通过WebDriver,您可以打开浏览器、导航到网页、查找元素、模拟用户操作(如点击、输入文本等),以及获取页面数据等。
4.Ppython + Selenium框架:使用Python和Selenium可以构建强大的自动化测试框架,实现Web应用程序的自动化测试。您可以编写Python脚本来控制浏览器,执行各种测试操作,验证页面的行为和状态,捕获错误和异常,生成测试报告等。
Python和Selenium框架的优点包括:
- 简单易学:Python具有简洁的语法和丰富的文档,使得编写测试脚本和维护自动化测试框架变得容易。
- 多浏览器支持:Selenium支持多种主流的浏览器,使得您可以在不同的浏览器上运行测试,确保应用程序在不同浏览器中的兼容性。
- 强大的API和功能:Selenium提供了丰富的API和功能,使您能够模拟用户操作、处理弹窗、处理多窗口、执行JavaScipt等,以及访问和验证网页的各种元素和属性。
- 第三方库支持: Python拥有庞大的第三方库生态系统,您可以利用各种库来增强测试框架的功能,如测试报告生成、数据驱动测试等。·开源和活跃的社区支持: Python和Selenium都是开源的,并且拥有庞大的社区支持,您可以从社区中获取到丰富的资源、教程和解决方案。
总之,Python和Selenium是一对强大的组合,用于构建自动化测试框架和进行Web应用程序的自动化测试。它们提供了丰富的功能和灵活性,使测试变得更加简单、高效和可靠。
Python+Selenium环境搭建
1.首先我们需要下载Pycharm 下载地址:Download PyCharm: Python IDE for Professional Developers by JetBrains
2.我们需要配置相关的python环境 下载地址:Download Python | Python.org
3.下载相关浏览器的驱动并放入python目录下(驱动必须要与浏览器版本对应,可以去浏览器设置中查询)
必应驱动下载地址:Microsoft Edge WebDriver - Microsoft Edge Developer
谷歌驱动下载地址:ChromeDriver - WebDriver for Chrome - Version Selection
4.进入pycharm打开终端输入 pip install selenium==3.9(现在3.9一般都够用)
5.上面操作完成后可以输入以下代码(谷歌)
from selenium import webdriver
driver=webdriver.Chrome();
deiver.get('http://www.baidu.com')
如果弹出谷歌页面后跳转到百度界面了则环境搭建成功。
学习笔记
一、使用selenium编写第一个脚本
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Edge()
driver.get('http://www.baidu.com/')
#找到输入框的位置,输入数据
driver.find_element(By.CLASS_NAME,'s_ipt').send_keys("qql")
#找到搜索框的位置点击搜索
driver.find_element(By.CLASS_NAME,'s_btn').click()
time.sleep(10)
driver.close()
使用driver.find_element(By.CLASS_NAME,'s_ipt').send_keys("qql")查找到百度首页界面的输入框并输入qql,进入百度首页后按F12或fn+F12进入开发工具
点击上图的标志再点击输入框可以在元素界面查找到相应的前端代码,这里以前端class的命名为查询条件,通过刚才的操作可以得到输入框和搜索按钮的class名称
二、元素定位方式
1.By.ID
通过F12找到百度页面搜索框板块的id,查找到id为kw,再想搜索框中输入selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Edge()
driver.get("http://www.baidu.com/")
element = driver.find_element(By.ID,"kw")
element.send_keys("selenium")
driver.quit()
2.By.CLASS_NAME
通过F12在元素中找到前端板块对应的class名称进行操作,具体操作参考学习笔记第一部分
3.By.TAG_NAME
使用"TAG_NAME"(标签名)作为元素定位策略,可以通过HTML标签名来定位Web页面中的元素。通过指定标签名,Selenium可以找到匹配该标签名的所有元素,并可以通过索引来选择其中的特定元素
rom selenium import webdriver
from selenium.webdriver.common.by import By
# 创建 WebDriver 实例
driver = webdriver.Edge()
# 打开网页
driver.get("https://www.baidu.com")
# 通过标签名定位元素
elements = driver.find_elements(By.TAG_NAME,"a")
# 遍历并输出匹配的元素
for element in elements:
print(element.text)
# 关闭浏览器
driver.quit()
4.By.NAME
使用 "NAME"
作为元素定位策略,可以通过元素的 name
属性值来定位Web页面中的元素。通过指定 name
属性值,Selenium可以找到匹配该属性值的元素
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建 WebDriver 实例
driver = webdriver.Edge()
# 打开网页
driver.get("https://www.baidu.com")
# 通过名称属性定位元素
element = driver.find_element(By.NAME, "referrer")
# 输出元素文本内容
print(element.text)
# 关闭浏览器
driver.quit()
5.By.LINK_TEXT
使用 "LINK_TEXT
"(链接文本)作为元素定位策略,可以通过链接文本内容来定位Web页面中的链接元素。通过指定链接文本,Selenium可以找到匹配该文本的链接元素
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建 WebDriver 实例
driver = webdriver.Edge()
# 打开网页
driver.get("https://www.baidu.com")
# 通过链接文本定位元素
element = driver.find_element(By.LINK_TEXT, "新闻").click()
# 关闭浏览器
driver.quit()
6.By.CSS_SELECTOR
使用 “CSS_SELECTOR
”(CSS选择器)作为元素定位策略,可以通过CSS选择器语法来定位Web页面中的元素。通过指定CSS选择器,Selenium可以找到匹配该选择器的元素
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建 WebDriver 实例
driver = webdriver.Edge()
# 打开网页
driver.get("https://www.baidu.com")
# 通过CSS选择器定位元素
element = driver.find_element(By.CSS_SELECTOR, "div.container > h1.title")
# 输出元素文本内容
print(element.text)
# 关闭浏览器
driver.quit()
7.By.XPATH
使用“By.XPATH
” (XPath)作为元素定位策略,可以通过XPath表达式来定位Web页面中的元素。XPath是一种用于在XML和HTML文档中定位和选择元素的语言
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建 WebDriver 实例
driver = webdriver.Edge()
# 打开网页
driver.get("https://www.iviewui.com/view-ui-plus/component/form/radio")
# 通过XPath定位元素
element = driver.find_element(By.XPATH, //input[@type="radio" and @class="ivu-radio-input"]')[1].click()
# 关闭浏览器
driver.quit()
三、单选框Radio定位
单选框因为有多个选项可以选择所以这里我们需要使用find_elements,这里根据input的标签的type和class来定位,再通过数组的形式定位多个单选框中的一个进行点击
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Edge()
driver.get("https://www.iviewui.com/view-ui-plus/component/form/radio")
driver.find_elements(By.XPATH,'//input[@type="radio" and @class="ivu-radio-input"]')[1].click()
time.sleep(2)
driver.find_elements(By.XPATH,'//input[@type="radio" and @class="ivu-radio-input"]')[2].click()
time.sleep(1)
driver.find_elements(By.XPATH,'//input[@type="radio" and @class="ivu-radio-input"]')[3].click()
time.sleep(3)
driver.close()
这里根据单选框的内容来定位点击单选框
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Edge()
driver.get("https://www.iviewui.com/view-ui-plus/component/form/radio")
driver.find_element(By.XPATH,'//span[text()="Windows"]').click()
time.sleep(4)
driver.close()
XPath表达式 //span[text()="Android"]/preceding-sibling::span/input
用于定位在文本内容为 "Android" 的 <span>
元素之前的兄弟元素 <input>
。
解析这个XPath表达式的含义:
//span[text()="Android"]
:选择文本内容为 "Android" 的任意<span>
元素。/preceding-sibling::span
:选择在目标<span>
元素之前的所有兄弟元素中的<span>
元素。/input
:选择在之前所选的<span>
元素之前的<span>
元素的所有子元素中的<input>
元素。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Edge()
driver.get("https://www.iviewui.com/view-ui-plus/component/form/radio")
driver.find_element(By.XPATH,'//span[text()="Android"]/preceding-sibling::span/input').click()
time.sleep(4)
driver.close()
四、CheckBox多选框定位
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Edge()
driver.get("https://www.iviewui.com/view-ui-plus/component/form/checkBox")
driver.find_element(By.XPATH,'//span[text()="香蕉"]/preceding-sibling::span/input').click()
time.sleep(2)
driver.find_element(By.XPATH,'//span[text()="苹果"]/preceding-sibling::span/input').click()
time.sleep(5)
driver.find_element(By.XPATH,'//span[text()="西瓜"]/preceding-sibling::span/input').click()
time.sleep(4)
driver.close()
五、pytest
1.首先需要进入终端下载pytest,输入pip install pytest
2.进入设置,搜索pytest,将默认测试运行程序改为pytest即可
3.pytest测试用例命名规范
- py测试文件必须以“test.”开头(或“_test”结尾)
- 测试方法必须以“test”开头
- 测试类必须以Test开头,并且不能有init方法
4.@pytest.fixture(scope="function",autouse=True)、assert用法
import pytest
#可以在每个测试函数运行前或者运行后进行调用
@pytest.fixture(scope="function",autouse=True)
def fixture1():
print("我是前置步骤1。。。。")
return 1
@pytest.fixture(scope="function")
def fixture2():
print("我是前置步骤2。。。。")
return 1
def test_fixture1():
assert 1 == 1
def test_fixture2():
assert 1 == 1
if __name__ == '__main__':
pytest.main()
@pytest.fixture
是 Pytest 测试框架中的装饰器,用于定义测试用例执行前后需要进行的一些准备和清理工作
scope="function"
表示夹具的作用域仅限于测试函数(测试用例)的执行过程中,即每个测试函数都会使用独立的夹具实例。具体来说,当使用 scope="function"
时,每个测试函数在执行之前都会执行一次夹具的准备工作,在执行之后会执行一次夹具的清理工作,确保测试函数之间的独立性
当 autouse=True
时,夹具会自动在每个测试函数执行之前进行设置操作,并在测试函数执行之后进行清理操作。这样,无论测试函数是否显式地引用夹具,都会自动应用夹具的功能
assert
是一种用于断言条件是否为真的关键字。它用于在程序中进行断言检查,以确保某个条件满足
5.使用类和方法来实现UI自动化测试
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
@pytest.fixture()
def driver():
driver = webdriver.Edge()
#窗口最大化
driver.maximize_window()
return driver
class TestBaidu:
def test_baidu(self, driver):
driver.get("https://www.baidu.com/")
title = driver.title
url = driver.current_url
text = driver.find_element(By.CSS_SELECTOR, "a[href='http://news.baidu.com']").accessible_name
button_text = driver.find_element(By.ID, 'su').accessible_name
assert title == "百度一下,你就知道"
assert url == "https://www.baidu.com/"
assert text == "新闻"
assert button_text == "百度一下"
def test_baidu(self, driver):
driver.get("https://www.baidu.com/")
title = driver.title
url = driver.current_url
text = driver.find_element(By.CSS_SELECTOR, "div#s-top-left>a:first-child").accessible_name
button_text = driver.find_element(By.ID, 'su').accessible_name
assert title == "百度一下,你就知道"
assert url == "https://www.baidu.com/"
assert text == "新闻"
assert button_text == "百度一下"
if __name__ == '__main__':
pytest.main()
六、parametrize+yaml
.py
import time
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from test.read import read_yaml
@pytest.fixture()
def driver():
driver = webdriver.Edge()
return driver
@pytest.mark.parametrize("key", read_yaml()['skill'])
def test_baidu(driver, key):
driver.get("https://www.baidu.com/")
driver.find_element(By.ID, 'kw').send_keys(key)
driver.find_element(By.ID, 'su').click()
time.sleep(1)
@pytest.mark.parametrize("data",read_yaml()['userinfos'])
def test_login (driver,data):
driver.get("http://sellshop.5istudy.online/sell/user/login_page")
driver.find_element(By.ID, 'username').send_keys(data['username'])
driver.find_element(By.ID,'password').send_keys(data['password'])
driver.find_element(By.CSS_SELECTOR, '#login > form > p.login.button > input[type=submit]').click()
time.sleep(2)
@pytest.mark.parametrize("username,password",read_yaml()['userinfos_list'])
def test_login1 (driver,username,password):
driver.get("http://sellshop.5istudy.online/sell/user/login_page")
driver.find_element(By.ID, 'username').send_keys(username)
driver.find_element(By.ID,'password').send_keys(password)
driver.find_element(By.CSS_SELECTOR, '#login > form > p.login.button > input[type=submit]').click()
if username == 'admin':
test = driver.find_element(By.CSS_SELECTOR,"body > div > div > div > div > strong").text
assert test == "用户不存在"
time.sleep(2)
@pytest.mark.parametrize("key", read_yaml()['skill'])
的作用如下:
-
参数化测试函数:
@pytest.mark.parametrize
可以将测试函数参数化,将测试函数的输入值与测试逻辑进行关联。在这个例子中,参数化的参数是 "key",它的值是read_yaml()['skill']
-
读取 YAML 数据:
read_yaml()
函数用于读取 YAML 数据文件,并返回一个包含技能列表的字典。read_yaml()['skill']
表示从这个字典中获取 "skill" 键对应的值,即技能列表 -
执行参数化测试:
@pytest.mark.parametrize("key", read_yaml()['skill'])
将测试函数的 "key" 参数与技能列表中的每个值进行关联,并在每个值上运行相同的测试逻辑
.yaml
userinfo:
- username: admin
password: 123456
skill:
- 接口自动化
- UI自动化
- 性能测试
userinfos:
- username: admin
password: 123456
- username: test01
password: 123456
userinfos_list:
- [admin,123456]
- [test01,123456]
skills:
- 接口自动化
- UI自动化
- 性能测试
skills2:
- [接口自动化,UI自动化,性能测试]
yaml识别配置文件
import yaml
def read_yaml():
with open('data.yaml', encoding="utf8") as f:
data = yaml.load(f,Loader=yaml.FullLoader)
return data
if __name__ == '__main__':
print(read_yaml())
完结撒花✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿