1.文件上传
1).定位下载文件的按钮元素
# 定位下载文件的按钮元素
xpath的定位方式:
# 标签+属性进行xpath定位
driver.find_element_by_xpath(//标签名[@属性名=属性值])
# 层级定位
1).只找标签名下面的子标签,不包含更下一层的标签
driver.find_element_by_xpath(//标签名[@属性名=属性值]/子标签名)
2).找到该标签名下面所有符合规则的子标签名
driver.find_element_by_xpath(//标签名[@属性名=属性值]//子标签名)
# 索引定位 索引从 1 开始 只查找平级标签
driver.find_element_by_xpath(//标签名/子标签名[索引值])
# 模糊匹配
driver.find_element_by_xpath(//标签名[contains(@属性名,部分属性值)])
# 多条件查找
driver.find_element_by_xpath(//标签名[@属性1=属性值1 and @属性2=属性值2])
css的定位方式:
# 标签+属性定位
driver.find_element_by_css_selector(标签名[属性名=属性值])
类选择器:.class的值 id选择器:#id值
# 层级
1).包含选择器会选择子标签以及子标签下面的标签
driver.find_element_by_css_selector(标签名[属性名=属性值] 子标签 )
2).只会选择该标签下的子标签
driver.find_element_by_css_selector(标签名[属性名=属性值]>子标签 )
# 索引
1).只要标签名下面是第索引个标签的都会找到
driver.find_element_by_css_selector(标签名[属性名=属性值] :nth-child(索引值))
2).只找标签名下面的第索引个标签
driver.find_element_by_css_selector(标签名[属性名=属性值]>:nth-child(索引值))
# 模糊匹配
driver.find_element_by_css_selector(标签名[属性名*=部分属性值])
# 多条件查找
driver.find_element_by_css_selector(标签名[属性名1=属性值1][属性名2=属性值2])
2).使用 send_keys(文件路径) 来上传文件
元素.send_keys(文件路径)
下载文件:---火狐
# 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")
下载文件:---谷歌
# 实例化下载文件的方法
options = webdriver.ChromeOptions()
# download.default_directory 配置下载路径
# profile.default_content_settings.popups 取消弹窗询问
pres = {
"download.default_directory": "D://",
"profile.default_content_settings.popups": 0
}
cookie
网页上怎么去查看cookies 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()
验证码处理:
验证码处理方案: 1.在测试环境去掉验证码---需要开发配合 2.设置万能码---程序后门 3.图片验证码识别技术 Python-tesseract ---不建议的方式,不稳定 4.cookie伪装---实际项目中不确定就问前端开发
# 伪装了已经登录的cookie
cookie_list = [{"name": "BDUSS", "value":"pJd3NZM0xMZXpZVW9Uck9ULVNQSTlublRNLXhJTkNwM0NNaH5iQ21HUk5CSlZrSVFBQUFBJCQAAAAAE"},
{"name":"BDUSS_BFESS",
"value":"pJd3NZM0xMZXpZVW9Uck9ULVNQSTlublRNLXhJTkNwM0NNaH5iQ21HUk5CSlZrSVFBQUFBJCQAAAAAAA}]
# 把cookie添加到原本的cookies里面
for cookie in cookie_list:
driver.add_cookie(cookie)
time.sleep(5)
# 刷新浏览器
driver.refresh()
time.sleep(10)
driver.quit()
元素等待
1).强制等待
强制等待:time.sleep(秒数) 无论元素是否加载完毕,都要等这么久
2).隐式等待
driver.implicitly_wait(10) 等待页面元素加载完毕,最多等10秒钟时间,往下执行查找元素, 如果页面所有元素在 3 秒加载完毕,那么就只等待3秒钟
#缺点
1.需要等待整个页面加载完毕之后才会往下执行,但是存在页面还未加载完毕,想要操作的元素已经加载完毕,因此会浪费等待时间
2.超过等待时间之后,如果页面还未加载完毕,接着往下执行 有可能存在元素找不到的问题
#优点
针对driver的整个周期有效,只需要设置一次
3)显示等待
# 导包
from selenium.webdriver.support.wait import WebDriverWait
# 语法
WebDriverWait(driver,超时时间,检测频率,忽略异常)
# 查找某个元素,一直查找10秒钟,每个0.5秒检测一次,存在则返回元素,不存在抛出TimeoutException的异常
# 其中until方法的message参数是可选抛出异常信息的参数
element = WebDriverWait(driver,10).until(lambdax:x.find_element_by_id("someId"),message="报错信息")
# 实现逻辑分析:
1.WebDriverWait(driver, 10)实例化一个显式等待类
2.调用until方法,把匿名函数传给 method 参数
3.method 参数使用 method(self._driver)来达到查找元素的功能
__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
# 调用
Student("张三")(1, 2, 3, 4, 5)
EC模块
# expected_conditions 一般使用时候会通过 as 取别名为 EC
from selenium.webdriver.support import expected_conditions as EC
# EC模块实际上就是selenium官方封装的一些用来 断言 的方法
断言:判断预期结果和实际结果是否相符合
# 检查页面的title与期望值是都完全一致,如果完全一致,返回True,否则返回Flase
EC.title_is("百度一下,你就知道")(driver)
EC.title_contains("百度一下")(driver) # 这个是部分匹配(类似于xpath里面的contains语法)
EC和显示等待结合使用
locator = ("id", "kw")
# EC和显示等待结合使用
ele = WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator), message='输入框找不到')
ele.send_keys("北京天安门")
time.sleep(10)
driver.quit()
综合使用
# 例子
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def find_element(driver, locator, timeout=20, msg=''):
return WebDriverWait(driver, timeout).until(EC.presence_of_element_located(locator), message=msg)
# 1.实例化一个driver
driver = webdriver.Chrome()
# 2.打开对应的网页
driver.get('http://localhost:8080/ecshop/user.php')
# 3.定位用户名
user_locator = ("name", "username")
user_ele = find_element(driver, user_locator)
# user_ele = WebDriverWait(driver, 20).until(EC.presence_of_element_located(user_locator))
# 4.输入账号
user_ele.send_keys("admin2")
# 5.定位密码
password_locator = ("name", "password")
password_ele = WebDriverWait(driver, 20).until(EC.presence_of_element_located(password_locator))
# 6.输入密码
password_ele.send_keys("123456")
# 7.点击立即登录
login_locator = ("name", "submit")
WebDriverWait(driver, 20).until(EC.presence_of_element_located(login_locator)).click()
# 8.定位到账号的元素
admin_locator = ("class name", "f4_b")
try:
ele = WebDriverWait(driver, 20).until(EC.presence_of_element_located(admin_locator))
except Exception as e:
print(False)
print(f"元素没有定位到:{e}")
else:
# 9.判断登录之后的账号是否正确,正确打印 True 否则 False
if ele.text == 'admin2':
print(True)
else:
print(False)