1.上传文件
方法:
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')
# 最大化浏览器
driver.maximize_window()
# 下拉滚动条
js = 'window.scrollTo(0,1000)'
driver.execute_script(js)
# 定位到上传文件的按钮,不点击!
ele = driver.find_element_by_name('upfilea')
# 使用send_keys上传文件
ele.send_keys(r'E:\310测试精英班\考试\python考试.md')
time.sleep(3)
driver.quit()
注意:1.文件路径有 / ,在路径前加上r
2.一定不要点击上传文件按钮!!!点了无法退出窗口!!!会报错!!!
2.下载文件
2.1 下载文件---火狐
配置火狐浏览器的首选项(可以直接百度方法)
设置成2表示使用自定义的路径,0下载到桌面,1使用默认地址
browser.download.folderList
是否显示开始下载,True表示显示,False表示不显示
browser.download.manager.showWhenStarting
设置自定义下载的路径
fp.set_preference("browser.download.dir",'d:\\')
是否需要弹窗询问
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")
import time
from selenium import webdriver
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
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()
2.2 下载文件---谷歌
download.default_directory 配置下载路径
profile.default_content_settings.popups 取消弹窗询问
import time
from selenium import webdriver
pres = {
"download.default_directory": "D://",
"profile.default_content_settings.popups": 0
}
options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', pres)
driver = webdriver.Chrome(options=options)
driver.get('https://pypi.org/project/selenium/#files')
time.sleep(5)
driver.find_element_by_partial_link_text('selenium-4.9.1').click()
3.cookie处理
页面手动查看:
1.打开F12--点击Application
2.在左侧选择 cookies
语法:
获取所有的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 返回一个字典,一个cookie是一条字典
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())
print('=' * 100) # 分割线
# 删除其中某一个cookie
driver.delete_cookie('TestBaidu')
print(driver.get_cookies())
print('=' * 100) # 分割线
# 删除所有的cookie,一个空列表
driver.delete_all_cookies()
print(driver.get_cookies())
time.sleep(10)
driver.quit()
4.验证码处理
处理方案:1.在测试环境去掉验证码------需要开发配合
2.设置万能码------程序后门
3.图片验证码识别技术 python-tesseract------不建议,不稳定
4.cookie伪装,绕过验证码
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
# 对比登录前后的cookies,将新增内容整理成列表
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)
time.sleep(5)
# 刷新浏览器
driver.refresh()
time.sleep(10)
driver.quit()
5.元素等待
分为强制等待,隐式等待和显示等待
5.1 强制等待 使用time模块
time.sleep(秒数) 无论页面是否加载完全,要使用的元素是否加载出来,都会等待满时间
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(10)
driver.find_element_by_id('kw').send_keys('源码时代')
5.2 隐式等待 页面对象.implicitly_wait(秒数)
等待页面元素加载完毕,最多等10秒钟时间,往下执行查找元素
如果页面所有元素在 3 秒加载完毕,那么就只等待3秒钟
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 等待页面元素加载完毕,最多等10秒钟时间
# 如果页面所有元素在 3 秒加载完毕,那么就只等待3秒钟
driver.implicitly_wait(10)
driver.find_element_by_id('kw').send_keys('源码时代')
优点:
针对driver的整个周期有效,只需要设置一次
缺点:
1.需要等待整个页面加载完毕之后才会往下执行,但是存在页面还未加载完毕,想要操作的元素已经加载完毕,因此会浪费等待时间
2.超过等待时间之后,如果页面还未加载完毕,接着往下执行有可能存在元素找不到的问题
5.3 显示等待
导包
from selenium.webdriver.support.wait import 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 = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id('kw'), "输入框没有找到")
element.send_keys("源码时代")
time.sleep(5)
driver.quit()
6.EC模块
导包
from selenium.webdriver.support import expected_conditions as EC
EC模块: expected_conditions 一般使用时候会通过 as 取别名为 EC
EC模块实际上就是selenium官方封装的一些用来 断言 的方法
断言:判断预期结果和实际结果是否相符合
EC模块的方法大多都有__call__魔法方法,因此可以直接()调用(后续详细解释__call__方法)
EC.title_is("百度一下,你就知道")(driver) 对比结果结果是否一致
EC.title_contains("百度一下")(driver) 对比结果是否包含EC.presence_of_element_located(locator=locator) 可以定位元素
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()
7. EC和显示等待结合使用
import time
from selenium import webdriver
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')
locator = ("id", "kw")
ele = WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator), message='输入框找不到')
ele.send_keys("源码时代")
time.sleep(10)
driver.quit()
补充
__call__:是一个魔法方法
执行时机:直接执行对象的时候 如:对象() 就会直接调用执行 __call__方法
作用:把对象当做是一个函数来进行调用
class Student(object):
def __init__(self, name):
print("实例化的时候执行__init__方法")
self.name = name
def __call__(self, *args, **kwargs):
print("执行__call__方法")
print(args)
print(self.name)
return self.name
def add(self, num1, num2):
print(num1 + num2)
# stu1 = Student("张三")
# stu1(1, 2, 3, 4, 5)
# stu1.add(1, 2)
Student("张三")(1, 2, 3, 4, 5)