一.上传文件
1.定位下载文件的按钮元素
2.使用 send_keys(文件路径) 来上传文件
示例:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('file:///E:/310%E6%B5%8B%E8%AF%95%E7%B2%BE%E8%8B%B1%E7%8F%AD/10web%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/2023-05-24web%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95day04/resources/%E7%BB%83%E4%B9%A0%E9%A1%B5%E9%9D%A2/%E6%B3%A8%E5%86%8CA.html')
# 定位上传文件的按钮
ele = driver.find_element_by_name('upfilea')
# 使用send_keys上传文件
ele.send_keys(r'E:\考试\考试.md')
time.sleep(3)
driver.quit()
二.下载文件火狐/谷歌
使用selenium.webdriver实现下载文件功能,只需要配置一下浏览器的参数即可实现
对于Firefox,需要我们设置其Profile:
1.browser.download.dir:指定下载路径os.getcwd() 该函数不需要传递参数,用于返回当前的目录。
2.browser.download.folderList:设置成 2 表示使用自定义下载路径;设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径
3.browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器
4.browser.helperApps.neverAsk.saveToDisk:对所给出文件类型不再弹出框进行询问
application/octet-stream 为内容的类型
Chrome浏览器,设置其options:
1.download.default_directory:设置下载路径
2.profile.default_content_settings.popups:设置为0禁止弹出窗口
示例:火狐
import time
from selenium import webdriver
fp = webdriver.FirefoxProfile()
# browser.download.folderList 设置成2表示使用自定义的路径,0下载到桌面,1使用默认地址
fp.set_preference("browser.download.folderList",2)
# browser.download.manager.showWhenStarting 是否显示开始下载
# True表示显示,False表示不显示
fp.set_preference("browser.download.manager.showWhenStarting",False)
# 设置自定义下载的路径
fp.set_preference("browser.download.dir",'d:\\')
# 是否需要弹窗询问
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")
driver = webdriver.Firefox(firefox_profile=fp)
driver.get('https://pypi.org/project/selenium/#files')
time.sleep(5)
driver.find_element_by_partial_link_text('selenium-4.9.1').click()
三.cookie
- Cookie是一小段的文本信息;格式:python中的字典(键值对组成)
- Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie格式
- Cookie使用:当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态。
获取所有的cookie
driver.get_cookies()
获取指定name的cookie
driver.get_cookie(name)
添加一条cookie:
cookie_dict = {
"name": name值,
"value": value值
}
driver.add_cookie(cookie_dict)
删除一条cookie
driver.delete_cookie(name)
删除所有的cookie
driver.delete_all_cookies()
示例:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
# 获取所有的cookies
print(driver.get_cookies())
# 获取其中某一条
print(driver.get_cookie("BAIDUID_BFESS"))
# 添加cookie
cookie_dict = {
"name": "TestBaidu",
"value": "0x12222222222222222222222222222222222222222"
}
driver.add_cookie(cookie_dict)
print(driver.get_cookies())
# 删除其中某一个cookie
driver.delete_cookie('TestBaidu')
print(driver.get_cookies())
# 删除所有的cookie
driver.delete_all_cookies()
print(driver.get_cookies())
time.sleep(10)
driver.quit()
四.验证码处理
验证码处理方案:
1.在测试环境去掉验证码---需要开发配合
2.设置万能码---程序后门
3.图片验证码识别技术 Python-tesseract ---不建议的方式,不稳定
4.cookie伪装---实际项目中不确定就问前端开发
示例:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
# 伪装了已经登录的cookie
cookie_list = [
{"name": "BDUSS",
"value": "pJd3NZM0xMZXpZVW9Uck9ULVNQSTlublRNLXhJTkNwM0NNaH5iQ21HUk5CSlZrSVFBQUFBJCQAAAAAAAAAAAEAAAAPcn9Rt-i~8bXE0cC44Nfw1d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE13bWRNd21kYl"},
{"name": "BDUSS_BFESS",
"value": "pJd3NZM0xMZXpZVW9Uck9ULVNQSTlublRNLXhJTkNwM0NNaH5iQ21HUk5CSlZrSVFBQUFBJCQAAAAAAAAAAAEAAAAPcn9Rt-i~8bXE0cC44Nfw1d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE13bWRNd21kYl"}
]
# 把cookie添加到原本的cookies里面
for cookie in cookie_list:
driver.add_cookie(cookie)
# 刷新浏览器
driver.refresh()
time.sleep(3)
driver.quit()
五.元素等待
WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程;
为了保证脚本运行的稳定性,需要脚本中添加等待时间。
强制等待:time.sleep(秒数) 无论元素是否加载完毕,都要等这么久
隐式等待:driver.implicitly_wait(10)
等待页面元素加载完毕,最多等10秒钟时间,往下执行查找元素
如果页面所有元素在 3 秒加载完毕,那么就只等待3秒钟
缺点:
1.需要等待整个页面加载完毕之后才会往下执行,但是存在页面还未加载完毕,想要操作的元素已经加载完毕,因此会浪费等待时间
2.超过等待时间之后,如果页面还未加载完毕,接着往下执行有可能存在元素找不到的问题
优点:
针对driver 的整个周期有效,只需要设置一次
显示等待:
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait
WebDriverWait(driver,超时时间,检测频率,忽略异常)
查找某个元素,一直查找10秒钟,每个0.5秒检测一次,存在则返回元素,不存在抛出TimeoutException的异常
其中until方法的message参数是可选抛出异常信息的参数
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"),message="报错信息")
实现逻辑分析:
1.WebDriverWait(driver, 10)实例化一个显式等待类
2.调用until方法,把匿名函数传给 method 参数
3.method 参数使用 method(self._driver)来达到查找元素的功能
示例:
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# element = driver.find_element_by_id('kw')
# element.send_keys("源码时代")
# lambda 形式参数 : 代码表达式
# 变量 = lambda 形式参数 : 代码表达式
# 变量(实际参数)
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id('kw'), "输入框没有找到")
element.send_keys("百度百科")
time.sleep(5)
driver.quit()
六.EC模块
expected_conditions 一般使用时候会通过 as 取别名为 EC
EC模块实际上就是selenium官方封装的一些用来 断言 的方法
断言:判断预期结果和实际结果是否相符合
EC.title_is("百度一下,你就知道")(driver)
EC.title_contains("百度一下")(driver)
示例:
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
print(driver.title)
print(EC.title_is("百度一下,你就知道")(driver))
print(EC.title_contains("百度一下")(driver))
locator = ("id", "kw")
ele = EC.presence_of_element_located(locator=locator)(driver)
ele.send_keys("百度百科")
time.sleep(10)
driver.quit()