python+selenium自动化测试(基础篇三)-驱动浏览器+元素定位

  • 前言:
    上一篇中介绍了驱动浏览器器,只是介绍了打开关闭浏览器,本篇会继续介绍驱动浏览器的:窗口尺寸设置、截图操作、刷新、前进和后端,以及新内容:元素定位。

一、驱动浏览器

  • 窗口尺寸设置:测试中我们会要求窗口处于最大或者处于特定的尺寸,所以需要掌握获取窗口大小和设置窗口的尺寸,代码如下:
# 导入模块
from selenium import webdriver
import time

driver = webdriver.Chrome()  # 创建驱动对象,启动浏览器
#定义一个获取窗口大小的函数
def get_window_size():
    size = driver.get_window_size()  # 获取窗口大小,
    print(size)  # 打印下窗口的尺寸大小
    time.sleep(3)  # 稍微等待一会
    
driver.get("https://www.baidu.com/")  # 打开百度的网址
get_window_size()                     # 调函数获取当前的尺寸
driver.set_window_size(800, 600)      # 重新设置尺寸
get_window_size()                     # 在获取尺寸,前后对比发现尺寸变成了我们设置的,证明重新设置尺寸成功了
driver.maximize_window()              # 窗口最大化
get_window_size()                     # 看下最大化的窗口尺寸

下面是三次的窗口尺寸大小观察一下:
{'width': 1050, 'height': 660}
{'width': 800, 'height': 600}
{'width': 1296, 'height': 696}
  • 网页截图:在执行自动化过程中,会经常有截图的需求,比如当用例执行失败的时候,把当前所处的界面截图保存下来,辅助后面排查问题,webdriver本身给提供了下面几种截图的选择:

第一种:获取截屏png图片,参数是文件名称,截屏必须是.png图片

# 导入模块
from selenium import webdriver
import time

driver = webdriver.Chrome()  # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/")
time.sleep(3)
driver.get_screenshot_as_file(r"D:\python\code\img\1.png")  # 调截图的方法,这是直接就会生成一张png的图片
time.sleep(2)

第二种:获取二进制数据流

# 导入模块
from selenium import webdriver
import os

driver = webdriver.Chrome()  # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/")  # 打开百度浏览器
img_dir = os.path.join(os.path.dirname(__file__), "img")  # 定义png存放路径
if not os.path.exists(img_dir):  # 判断路径是否存在
    os.makedirs(img_dir)
png_data = driver.get_screenshot_as_png()  # 截图,二进制流的
filename = os.path.join(img_dir, "test_screen.png")  # 路径拼接
with open(filename, "wb") as f:  # 把获取的二进制流的png信息写入到filename的路径中,最后生成的也是png的图片
    f.write(png_data)

第三种:获取截屏的base64编码数据,在HTML界面输出截图时使用。

from selenium import webdriver
import os
import  base64

driver = webdriver.Chrome()  # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/")  # 打开百度浏览器
img_dir = os.path.join(os.path.dirname(__file__), "img")  # 定义png存放路径
if not os.path.exists(img_dir):  # 判断路径是否存在
    os.makedirs(img_dir)
base64_data = driver.get_screenshot_as_base64()  # 截图,base64的流信息
png_data = base64.b64decode(base64_data)
filename = os.path.join(img_dir, "test_screen1.png")  # 路径拼接
with open(filename, "wb") as f:  # 把获取的二进制流的png信息写入到filename的路径中,最后也会生成一张png图片
    f.write(png_data)

第四种方法:driver.save_screenshot(filename/full_path)。这种不放代码了,自己可以试着写下代码,进行扩展。

  • 窗口刷新+后退+前进
    back()
    forward()
    这两个方法实现了后退和前进的功能
# 导入模块
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()  # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/")  # 打开百度浏览器
time.sleep(5)  # 睡眠一下,更直观的看见刷新的动作
driver.refresh()  # 直接掉刷新

driver.find_element_by_id("kw").send_keys("易烊千玺", Keys.ENTER)  # 这里面的Keys.ENTER是鼠标的操作,后面会讲到
time.sleep(2)
driver.back()  # 后退回到上一个界面,就是百度的首页
time.sleep(2)
driver.forward()  # 前进,再次回到搜索界面

二、介绍元素定位:
ps:元素定位涉及到了html的一些知识,比如网页的构成结构,什么是标签,什么是属性等。建议小伙伴们前去学习一下,不用太深,对于元素定位,把前面的弄懂就完全够用了。
webdriver提供了八种元素定位方式分别是:
id
name
class name
tag name
link text
partial link text
xpath
css selector
本篇先介绍前6种,只简单的介绍下怎么定位,driver定位的方法分别是什么。后面2种元素定位方式会单独的介绍,尤其是xpath,因为后面元素的定位几乎都是利用xpath来完成的。

上面的8中定位方式webdriver中对应的方式分别是:

driver.find_element_by_id("kw")  # 括号里面写的是定位元素,字符串
driver.find_element_by_name()
driver.find_element_by_class_name()
driver.find_elements_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_xpath()
driver.find_elements_by_css_selector()

下面介绍一下怎么从html代码中识别具体的前6种定位方式:
python+selenium自动化测试(基础篇三)-驱动浏览器+元素定位_第1张图片

图片的html源码是百度首页搜索框的:搜索框分别有class、id、name、tag name
利用这些来介绍前面的几种定位方式

driver.find_element_by_id("kw")  # 会找到一处匹配的元素
driver.find_element_by_name("wd") # 会找到一处匹配的元素
driver.find_element_by_class_name("s_ipt") # 会找到一处匹配的元素
driver.find_elements_by_tag_name("input")  #  会找到15处匹配项

python+selenium自动化测试(基础篇三)-驱动浏览器+元素定位_第2张图片
此图片的HTML是百度首页左上角的文本的源代码,这几个text文本的共性是:点击之后都会打开一个新的网页,看源代码可以看出都有href属性,并且值都是一个网址,具有这样共性的就可以使用下面的定位方式去定位:

driver.find_element_by_link_text("新闻")  # 精准匹配text文本
driver.find_element_by_link_text("hao123")
driver.find_element_by_partial_link_text("闻")  #  模糊匹配text文本
driver.find_element_by_partial_link_text("123")

ps:使用模糊匹配text定位方式的时候,确保写的text只能在超链接文本中只能找到一个匹配项。要不找到多处直接点击就会报错了。
parial link 定位:是对 link 定们的一个种补充,有些文本连接会比较长,这个时候我们可以取文本链接的有一部分定位,只要这一部分信息可以唯一的标识这个链接。

上面的定位方式找到的都是只有一个匹配项,在定位中id的属性一般都是唯一的,其他的定位方式大部分都不是唯一的,当然webdriver还提供了匹配多处匹配项的方法,他们找到的是多处匹配项,并且把找到的所有都会给你提供过来。

driver.find_elements_by_id()
driver.find_elements_by_name()
driver.find_elements_by_class_name()
driver.find_elements_by_tag_name()
driver.find_elements_by_link_text()
driver.find_elements_by_partial_link_text()
driver.find_elements_by_xpath()
driver.find_elements_by_css_selector()

例子:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()  # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/")  # 打开百度浏览器
time.sleep(5)  # 睡眠一下,更直观的看见刷新的动作
eles = driver.find_elements_by_tag_name("input")
print(eles)

定位的是tag name:输出的内容是如下:

[<selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="e5e6e853-68f1-44b9-9851-0a1b4985dff7")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="41ceb448-3a92-4bb9-93b1-81c5621ebf13")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="55c33252-dddd-4a1e-99b1-437062e580ee")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="ef29f493-ba4b-4dc3-836d-12cc2c00ddde")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="83d3bef1-0d68-4aca-8d93-cbbbc2ff6dcd")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="353d98e2-48dc-4d01-885e-951644109fbf")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="8813d5e4-b272-4d90-bbc5-9e50cf93a7cc")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="68774183-de72-4210-85b5-b777f51e6b0e")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="6e2b2642-3ef3-45d6-bb18-189a24422659")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="70641aba-68a4-457b-a77a-e0bce27ec5af")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="79c3c111-3056-4643-a646-4d56fc000f62")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="a2aba76c-bbfe-48b1-9763-bf9c2a70e78b")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="ee63408b-9147-44aa-a6ca-3600fd0efe74")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="ccdd7aef-215e-4094-be83-e022d8e83f9f")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="46b9285c-8199-4f0b-8435-2c65165f1eb5")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="11f92382-105a-4ccf-9886-a28eeb6eb7a9")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="89d9ba0e-fb5d-4df0-8de2-0f8010681d73")>]

这就是找到的搜索的匹配元素的对象。装成一个列表给你返回了。其实定位方式,方法都一样,和上面的定位方式对比发现,在element这一出,匹配多处的定位方法上多了一个s。相信根据大家来说肯定知道s一般指的就是多个的意思。这种定位方式返回的 是一个列表。但是在真正的自动化定位元素来说,找多处的方式是不推荐的。

小结
以上就是定位元素的一些方法。介绍的几种定位方法相对来说比较简单,我们理想状态下在一个页面当中每一个元素都会有一个唯一 id 和 name 属性值,我们通过它的属性值来找到他们,但在实际的项目中并非想象的这般美好。有时候一个元素并没有 id 或 name 属性,或者会有多个元素的。下一篇会介绍xpath定位和css定位。这两种定位在元素定位中可以找到99%的元素,并且找到的元素都是唯一的哦。

你可能感兴趣的:(笔记,python,selenium,pycharm)