自动化测试之五:WebDriver API(4)

本文围绕WebDriver自动化测试展开,介绍了警告框、下拉框处理,文件上传下载,cookie操作,调用JavaScript,处理HTML5视频播放,滑动解锁及窗口截图等常见操作。如用switch_to.alert()定位警告框,Select类处理下拉框等,还给出不同浏览器文件下载设置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11 警告框处理

在WebDriver中处理JavaScript生成的alert,confirm,promopt十分简单,具体做法是:首先使用switch_to.alert()方法定位,然后使用text,accept,dismiss,send_keys等进行操作。

text:返回alert,confirm,prompt中的文字信息

accept():接受现有警告框

dismiss():解散现有警告框

send_keys():在警告框中输入文字(如果可以输入的话)

可以使用switch_to.alert()方法为百度搜索设置弹窗

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver_path)

from time import sleep
from selenium.webdriver import ActionChains

driver.get("http://www.baidu.com")

# 打开搜索设置
above = driver.find_element_by_id("s-usersetting-top")  # 定位到要悬停的元素
ActionChains(driver).move_to_element(above).perform()  # 执行鼠标悬停操作
driver.find_element_by_link_text("搜索设置").click()
sleep(2)

# 保存设置
driver.find_element_by_link_text("保存设置").click()

# 获取警告框
alert = driver.switch_to.alert

# 获取警告框提示信息
alert_text = alert.text
print("警告框提示信息为:----->", alert_text)

# 接受警告
alert.accept()

# driver.quit()

12 下拉框处理

下拉框是Web页面常见功能之一,WebDriver提供了Select类来处理下拉框

Select类:用于定位<select>标签

select_by_value(): 通过value值定位下拉选项

select_by_visible_text():通过text值定位下拉选项

select_by_index():通过下拉选项的索引进行选择,第一个选项为0,第二个选项为1...

13 上传文件

上传文件是比较常见的Web功能之一,但WebDriver并没有提供专门用于上传的方法,实现文件上传的关键在于思路

在Web页面中,文件上传操作一般需要点击“上传”按钮后打开本地Windows窗口,从窗口中选择本地文件进行上传,因为WebDriver无法操作Windows控件,所以对于初学者来说,一般思路会卡在如何识别windows控件上。

在Web页面中一般通过以下两种方式实现文件上传:

    普通上传:将本地文件路径作为一个值房子input标签中,通过form表单将整个值提交给服务器

    插件上传:一把是指基于Flash,JavaScript或Ajax等技术实现的上传功能

对于普通上传而言,一般是通过input标签实现的上传功能,可以将其看作一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传

import os


from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver_path)

file_path = os.path.abspath("./files/")

upload_page = "file:///" + file_path + "上传页面.html"

driver.get(upload_page)

# 定位上传按钮
driver.find_element_by_id("file").send_keys(file_path + "test.txt")


注:这里的上传页面.html和上传的文件test.txt位于与当前程序同目录的files目录下,通过这种方式上传,就可以避免操作windows控件,如果能找到上传的input标签,基本上就可以通过send_keys()方法输入一个本地文件路径实现上传

对于插件上传 ,可以使用AutoIt来实现,可以自行搜索

14 下载文件

WebDriver允许我们设置默认的文件下载路径,也就是说,文件会自动下载并且存放到设置的目录,不同的浏览器有不同的设置方式,以firefox为例

import os

from selenium import webdriver

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.dir", os.getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "binary/octet-stream")

driver = webdriver.Firefox(firefox_profile=fp)
driver.get("https://pypi.org/project/selenium/#files")
driver.find_element_by_partial_link_text("selenium-3.141.0.tar.gz").click()

为了能在firefox浏览器中实现文件的下载,我们需要对firefoxProfile做一些设置:

fp.set_preference("browser.download.folderList", 2)    设置为0,表示文件会下载到浏览器的默认下载路径,设置为2,表示会下载到指定的目录
fp.set_preference("browser.download.dir", os.getcwd())    指定下载文件目录
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "binary/octet-stream")    指定要下载的类型,二进制或其他

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面以chrome浏览器为例:chrome浏览器在下载时默认不会弹出下载窗口,这里主要是修改下载路径

import os

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"


options = webdriver.ChromeOptions()

prefs = {
    "profile.default_content_settings.propus": 0,
    "downlod.default_directory": os.getcwd()
}

options.add_experimental_option("prefs", prefs)

driver = webdriver.Chrome(executable_path=chrome_driver_path, chrome_options=options)
driver.get("https://pypi.org/project/selenium/#files")
driver.find_element_by_partial_link_text("selenium-3.141.0.tar.gz").click()

"profile.default_content_settings.propus": 0,   设置为0,禁止弹出下载窗口
    "downlod.default_directory": os.getcwd()    设置文件下载路径

15 操作cookie

有时候我们需要验证浏览器中的cookie是否正确,因为基于真实的cookie是无法通过白盒测试和集成测试的,WebDriver提供了操作cookie的相关方法,可以读取,添加和删除cookie

WebDriver操作cookie的方法如下:

driver.get_cookies()                       获取所有cookie

driver.get_cookie(name)                    返回字典中key为name的cookie

driver.add_cookie(cookie_dict)             添加cookie

driver.delete_cookie(name)                 删除名为name的cookie

driver.delete_all_cookies()                删除所有cookie

15.1 get_cookies()

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver_path)

driver.get("http://www.baidu.com")
cookies = driver.get_cookies()
print("这是百度所有cookie:---->", cookies)
# driver.quit()

15.2 add_cookie()

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver_path)

driver.get("http://www.baidu.com")

driver.add_cookie({'name': 'foo', 'value': 'bar'})
driver.add_cookie({"name": "mt", "value": "mt"})
print("添加cookie成功。。。。。。。。。。")
cookies = driver.get_cookies()
print("这是添加后所有cookie:---->", cookies)

# driver.quit()

delete_cookie()和delete_all_cookies()一样简单,自行测试 

16 调用JavaScript

有些页面操作不能依靠webdriver提供的API来实现,比如浏览器滚动条的拖动,这是就需要借助JavaScript脚本,WebDriver提供了excute_script()方法来执行JavaScript代码

用于调整浏览器滚动条位置的JavaScript的代码如下:

window.scrollTo("左边距", "上边距")

该方法用于设置浏览器窗口滚动条的水平位置和垂直位置,第一个参数为水平的左边距,第二个参数为垂直的上边距

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver_path)

driver.get("http://www.baidu.com")
driver.set_window_size(800, 600)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()

# 通过javascript设置浏览器窗口的滚动条
js = "window.scrollTo(100, 500)"
driver.execute_script(js)

# driver.quit()

17 处理HTML5视频播放

大多数浏览器使用插件(如Flash)播放视频,但是,不同的浏览器主要使用不同的插件,HTML5定义了一个新的元素<video>,指定了一个标准的方式嵌入电影片段

下面介绍如何自动化测试<video>, <video>提供了JavaScript接口和多种方法及属性

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver_path)

from time import sleep
driver.get("http://videojs.com/")

video = driver.find_element_by_id("preview-player_html5_api")

# 返回播放文件地址
url = driver.execute_script("return arguments[0].currentSrc;", video)
print("url:::", url)

# 播放视频
print(" start play.........")
driver.execute_script("arguments[0].play()", video)

# 播放15秒
sleep(15)

# 暂停播放
print("stop.....")
driver.execute_script("arguments[0].pause()", video)


# driver.quit()

JavaScript有个内置对象叫做arguments,arguments包含了函数调用的参数数组,0表示取第一个值

currentSrc表示返回当前音频/视频的url,如果未设置音频或视频,则返回空字符串

load(), play(), pause()控制视频的加载,播放,暂停

18 滑动解锁

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver_path)

from time import sleep
from selenium.webdriver import ActionChains
from selenium.common.exceptions import UnexpectedAlertPresentException

# 这个地址不能访问了,再找其他的!!!
driver.get("https://www.helloweba.com/demo/2017/unlock/")

# 定位滑块解锁
slider = driver.find_elements_by_class_name("slide-to-unlock-handle")[0]
action = ActionChains(driver)
action.click_and_hold(slider).perform()

for index in range(200):
    try:
        action.move_by_offset(2, 0).perform()
    except UnexpectedAlertPresentException:
        break
    action.reset_actions()
    sleep(0.1)

# 打印警告信息
success_text = driver.switch_to.alert.text
print(success_text)


# driver.quit()

# 上下滑动选择日期(需要再次测试)

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

# 需要设置options,否则会报w3c验证错误
opt = webdriver.ChromeOptions()
opt.add_experimental_option('w3c',  False)

driver = webdriver.Chrome(executable_path=chrome_driver_path, chrome_options=opt)

from time import sleep
driver.get("https://www.jq22.com/yanshi4976")
sleep(2)

driver.switch_to.frame("iframe")
driver.find_element_by_id("appDate").click()

# 定位要划定的年月日
dwwos = driver.find_elements_by_class_name("dwwo")
year = dwwos[0]
month = dwwos[1]
day = dwwos[2]


action = webdriver.TouchActions(driver)
action.scroll_from_element(year, 0, 5).perform()    # 第一个参数滑动的元素,第二个x坐 
                                                    # 标,第三个y坐标
action.scroll_from_element(month, 0, 30).perform()
action.scroll_from_element(day, 0, 30).perform()


# driver.quit()

19 窗口截图

自动化测试是由程序执行的,因此有时候打印信息不够直观,如果脚本执行出错的时候能够对当前页面进行截图并保存,那么通过截图就可以很直观的看到脚本出错原因,WebDriver提供的截图参数为:save_screenshot()

from selenium import webdriver

chrome_driver_path = r"C:\Users\Administrator\Envs\selenuimAutoTest\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver_path)


driver.get("http://www.baidu.com")

driver.save_screenshot("./baidu.png")

# drive.quit()

WebDriver建议使用png作为图片的后缀

 

在每一个实例中都有一个quit方法,其含义是退出相关的驱动程序和关闭所有窗口,除此之外,还提供了close方法,用来关闭当前窗口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值