Python从0到1之Selenium

设计模式

数据驱动:数据和程序分离
关键字驱动:动作+被测元素+操作值
行为驱动:通过自然语言,执行测试用例
混合驱动:数据驱动+关键字驱动
分布式:在不同机器上运行

xpath

使用路径表达式选取xml文档中的节点或者节点集
找到被测试对象,操作对象,验证测试结果(断言)

HTML和XML的区别
HTML是特殊的XML,HTML的标签在浏览器进行过预定义,所以可以被渲和解析的

xpath中有七种类型的节点
元素、属性、文本、命名空间、处理指令、注释以及文档根节点

XML文档是被作为节点树来对待的,树的根被成文文档节点或者根节点

节点:标签
基本值 无父或无子的节点
父节点:每个元素和属性都有一个父节点

选取节点
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择当前节点选择文档中的节点,从而不考虑他们的位置
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性


<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>测试网页</title>
</head>
<body>
	<div id=div1>
	<p>今天天气不错</p>
	<p>挺风和日丽的</p>
	<p>我们下午没有课</p>
	</div>

	<div id=div2 name="测试">
	<p>今天天气不错<span>但是我在上课</span></p>
	<p>挺风和日丽的</p>
	<p>我们下午没有课<input type="text" name="">文本内容</input></p>
	</div>


</body>
</html>

//* 定位找到所有元素
//input 定位指定元素
//[@] 定位属性的元素
//[@id] 定位id的元素
//
[@id=“div1”] 定位某个id的元素
//[@id="div2"and@name=“测试”] 2个属性定位唯一的元素
//
[@id!=“div2”] 定位不等于某个属性
//[contains(@name,“测”)] 包含模糊定位元素
//
[.=“挺风和日丽的”] 定位文本
//div[@id=“div1”]/*[.=“挺风和日丽的”] 准确定位元素

xpath实战

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_box = driver.find_element_by_xpath("//*[@id='kw']")
search_box.send_keys("测试")
query_button = driver.find_element_by_xpath("//*[@id='su']")
query_button.click()
time.sleep(5)
assert "测" in driver.page_source
driver.quit()

设计模式

数据驱动

程序不变,数据变,做到了程序和数据的分类,测试人员只要维护测试数据就可以了

数据文件test.txt

http://www.baidu.com
https://www.w3school.com.cn/
https://www.bilibili.com/

程序文件stest.py

from selenium import webdriver
import time

driver = webdriver.Chrome()  # 创建Chrome对象
# driver = webdriver.Firefox()
with open("test.txt",encoding="utf-8") as fp:
    for i in fp:
        print(i)
        driver.get(i)
        time.sleep(5)  # 5秒后关闭
driver.quit()

关键字驱动

一个关键字,能够映射到Python程序中的函数执行,关键字可以放在数据文件中,关键字驱动,所有动作都是分开的,关键字可以基于别的关键字进行封装
关键字模型
动作||定位表达式||操作值||断言值
关键字文件test.txt

visit||http://www.baidu.com
visit||https://www.w3school.com.cn/
visit||https://www.bilibili.com/

keytest.py

from selenium import webdriver
import time

def visit(url):
    global driver
    driver.get(url)
    time.sleep(5)

driver = webdriver.Chrome()
with open("test.txt") as fp:
    for line in fp:
        if line.strip()!="":
            action,url = line.split("||")
            url = url.strip()
            eval(action + "('" + url + "')")

混合驱动

数据+关键字
关键字文件test.txt

visit||http://www.baidu.com
visit||{testx.txt}

数据文件textx.txt

http://www.baidu.com
https://www.w3school.com.cn/
https://www.bilibili.com/

hhtest.py

from selenium import webdriver
import re,time

# 关键字映射函数
def visit(url):
    global driver
    driver.get(url)
    time.sleep(3)

driver = webdriver.Chrome()
with open("test.txt") as fp:
    for line in fp:
        if re.search(r"\{(.*?)\}",line):
            data_file = re.search(r"\{(.*?)\}",line).group(1)
            with open(data_file) as fp:
                for data in fp:
                    if data.strip() != "":
                        action = line.split("||")[0]
                        data = data.strip()
                        eval(action + "('" +data+ "')")

        elif line.strip()!= "":
            action,url = line.split("||")
            url=url.strip()
            eval(action+"('"+url+"')")

常用方法

webdriver

from selenium import webdriver
driver = webdriver.Chrome()

get()

打开网页

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

back() forward()

后退,前进

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.get("https://www.bilibili.com")
driver.back()
driver.forward()

find_element_by_id()

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw") # <selenium.webdriver.remote.webelement.WebElement (session="180af6801677443ed827ce068badec20", element="13dac842-0f5b-4374-b4e4-431c7e5cf46e")>

find_element_by_xpath()

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_xpath("//*[@id='kw']") # <selenium.webdriver.remote.webelement.WebElement (session="180af6801677443ed827ce068badec20", element="13dac842-0f5b-4374-b4e4-431c7e5cf46e")>

find_element_by_name()

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_name("wd") #<selenium.webdriver.remote.webelement.WebElement (session="3499eef4c0a7ba82052e2ef788eb9f89", element="f53b6f1a-6334-40bd-a618-13f7e0114af4")>

注意 find_elements_by_name() elements可以找到多个元素,返回列表,可以用坐标取

send_keys()

输入内容

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("北京")

click()

点击

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("北京")
driver.find_element_by_id("su").click()

close()

关闭当前标签

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.close()

quit()

退出浏览器

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.quit()

refresh()

刷新页面

driver.refresh()

注意:刷新或者页面跳转之后之前获取的元素都不能使用了,需要重新获取

title

查看标题

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.title # '百度一下,你就知道'
assert "百度一下,你就知道" in driver.page_source #断言某个数据在不在

常用定位方式

id
name
xpath

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值