一、下拉选择框
1.1.为什么单独使用下拉框?
如果option选项没有value值的话,css定位或其他定位就不太方便
1.2.说明
下拉框就是HTML中<select>元素
1.3.方法
1).select_by_index(index)-->根据option索引l来定位,从o开始
2).select_by_value(value)-->根据option属性value值来定位
3).select_by_visible_text(text)--->根据option显示文本来定位
1.4.注意
1).select类是通过select标签来控制其下的option元素
2).element:只能是select标签元素
3).调用select类下面的方法,是通过索引l、value值、显示文本来操作
1.5.代码
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("网页地址")
# 网页最大化
driver.maximize_window()
# 隐式等待 设置十秒钟,抛出异常
driver.implicitly_wait(3)
# # 1.CSS定位到下拉框
# driver.find_element(By.CSS_SELECTOR,"#sel").click()
# 2.实例化Select类并定位到下拉框
select = Select(driver.find_element(By.CSS_SELECTOR,"#sel"))
# # select类定位,通过下标访问
# select.select_by_index(0)
# # 暂停两秒钟
# sleep(2)
# # select类定位,通过下标
# select.select_by_index(1)
# # select类通过value定位
# select.select_by_value("p1")
# # 暂停两秒钟
# sleep(2)
# # select类通过value定位
# select.select_by_value("p2")
# select类通过文本
select.select_by_visible_text("op1")
# 暂停两秒钟
sleep(2)
# select类通过文本
select.select_by_visible_text("op2")
# 暂停两秒钟
sleep(2)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
二、弹出框
2.1.弹出框分类
1).警告框
2).确认框
3).提示框
2.2.处理弹出框方法
1).为什么处理弹出框?
如果页面有弹出框不处理,接下来的操作将不生效
2).获取弹出框对象:alert=driver.switch_to.alert,针对这三个弹出框处理方法都一样
3).调用
3.1).alert.text -->返回alert/confirm/prompt中的文本
3.2).alert.acceptO-->接受对话框选项
3.3).alert.dismissO--->取消对话框选项
4).提示:无论以上哪个对话框,都可以使用取消、同意,因为调用的是后台的事件,跟页面显示的按钮数量无关
2.3.注意
1).driver.switchto.alert方法适用于以上三种类型对话框,调用时没有括号
2).获取文本方法,调用时没有括号,如:alert.text
3).在项目中不是所有的小窗口都是以上三种对话框
2.4.代码
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("http://localhost:63342/test_new/%E5%BC%B9%E5%87%BA%E6%A1%86.html?_ijt=s77hg71t561faals5jrk4mgi4i&_ij_reload=RELOAD_ON_SAVE")
# 网页最大化
driver.maximize_window()
# 隐式等待 设置十秒钟,抛出异常
driver.implicitly_wait(3)
# 定位alert按钮并点击
driver.find_element(By.CSS_SELECTOR,"input[value='alert警告框']").click()
# 实例化弹出框对象
alert = driver.switch_to.alert
# 暂停两秒钟
sleep(2)
# 接受警告框
alert.accept()
# 定位confirm按钮并点击
driver.find_element(By.CSS_SELECTOR, "input[value='confirm确认框']").click()
# 确认框处理对象
confirm = driver.switch_to.alert
# 暂停两秒钟
sleep(2)
# 取消确认框
confirm.dismiss()
# 定位prompt按钮并点击
driver.find_element(By.CSS_SELECTOR, "input[value='prompt提示框']").click()
# 提示框处理对象
prompt = driver.switch_to.alert
# 取消提示框
prompt.dismiss()
# 暂停两秒钟
sleep(2)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
三、滚动条操作
3.1.概念
滚动条是一种可控制页面显示范围的组件
3.2.为什么要学习滚动条操作?
1).在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载
2).页面注册同意条款,需要滚动条到最底层,才能点击同意
3.3.实现方式
1).说明:selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的。
2).步骤:
2.1).设置JavaScript脚本控制滚动条
2.2).selenium调用执行JavaScript脚本的方法--->driver.execute_script(js)
3.4.说明
在selenium中没有直接提供定位滚动条组件方法,但是它提供了执行js语句方法,可以提供js语句来控制滚动条操作
3.5.代码
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://news.baidu.com/")
# 网页最大化
driver.maximize_window()
# 隐式等待 设置十秒钟,抛出异常
driver.implicitly_wait(3)
# 设置js脚本
js = "window.scrollTo(0, 1000);"
# 暂停两秒钟
sleep(2)
# 执行滚动条向下
driver.execute_script(js)
# 暂停两秒钟
sleep(2)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
四、frame表单切换(重点!)
4.1.概念
HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素
4.2.为什么要学习frame表单切换?
当前主目录内没有iframe表单页面信息,不切换,找不到元素
4.3.frame切换方法
1).说明:在Selenium中封装了如何切换frame框架的方法
2).方法
2.1).driver.switch_to.frame(frame_reference)---->切换到指定frame的方法。frame_reference:可以为frame框架的name、id或者定位到的frame元素(elemnent)
2.2).driver.switch_to.default_contentO---->恢复默认页面的方法
4.4.提示
1).为什么要回到主目录:iframe或frame只有在主目录才有相关元素信息,不回到主目录,切换语句会报错
2).如何回到主目录:driverswitch_to.default_contentO
3).切换表单时,可以使用name、id、iframe元素
4.5.代码
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://mail.qq.com/")
# 网页最大化
driver.maximize_window()
# 隐式等待 设置十秒钟,抛出异常
driver.implicitly_wait(3)
# 切换到第一个表单
FristFrame = driver.find_element(By.CSS_SELECTOR,"#QQMailSdkTool_login_loginBox_qq > iframe")
driver.switch_to.frame(FristFrame)
# 切换到密码登录表单
driver.switch_to.frame("ptlogin_iframe")
# 点击切换
driver.find_element(By.CSS_SELECTOR, "#switcher_plogin").click()
# 填写qq号
driver.find_element(By.CSS_SELECTOR,"#u").send_keys("admin")
# 填写密码
driver.find_element(By.CSS_SELECTOR, "#p").send_keys("123456")
# 提交登录
driver.find_element(By.CSS_SELECTOR, "#p").send_keys(Keys.ENTER)
# 暂停两秒钟
sleep(1)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
五、多窗口切换(重点!)
5.1.概念
在HTML页面中,当点击超链接或者按钮时,有的会在新的窗口打开页面
5.2.为什么切换多窗口?
页面存在多个窗口时,seleniu默认焦点只会在主窗甲上所有的元素,不切换切换窗口,无法操作除主窗口以外的窗口内元素
5.3.如何实现多窗口切换?
1).说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;句柄:英文handle,窗口的唯一识别码
2).方法:
2.1).driver.current_window_handle-->获取当前窗口句柄
2.2).driver.window_handles---->获取所有窗口句柄
2.3).driver.switch_to.window(handle)--->切换指定句柄窗口
5.4.代码
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://www.baidu.com/")
# 网页最大化
driver.maximize_window()
# 隐式等待 设置十秒钟,抛出异常
driver.implicitly_wait(3)
# 获取新闻对象
driver.find_element(By.XPATH,"//a[contains(text(),'新闻')]").click()
# 获取所有窗口的句柄
HandlesList = driver.window_handles
# 判断句柄与当前网页句柄是否一致,不一致则跳转
for handle in HandlesList:
if driver.current_window_handle != handle:
driver.switch_to.window(handle)
# 暂停两秒钟
sleep(2)
# 关闭窗口验证当前主窗口已切换
driver.close()
# 暂停两秒钟
sleep(2)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
六、窗口截图
6.1.概念
把当前操作的页面,截图保存到指定位置
6.2.应用场景
失败截图,可以让错误看的更直观
6.3.如何操作窗口截图?
1).说明:在Selenium中,提供了截图方法,我们只需要调用即可
2).方法
driver.get_screenshot_as_file(imgpath)--->imagpath:图片保存路径
6.4.扩展
1).多条用例执行失败,会产生多张图片,可以采用时间戳的形式,进去区分
2).driver.get_screenshot_as_file("./image/%s.png" %(time.strftime("%Y_%m_%d_%H_%M_%S"))strftime:将时间转为字符串函数
6.5.代码
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://mail.qq.com/")
# 网页最大化
driver.maximize_window()
# 隐式等待 设置十秒钟,抛出异常
driver.implicitly_wait(3)
# 切换到第一个表单
FristFrame = driver.find_element(By.CSS_SELECTOR,"#QQMailSdkTool_login_loginBox_qq > iframe")
driver.switch_to.frame(FristFrame)
# 切换到密码登录表单
driver.switch_to.frame("ptlogin_iframe")
# 点击切换
driver.find_element(By.CSS_SELECTOR, "#switcher_plogin").click()
# 填写qq号
driver.find_element(By.CSS_SELECTOR,"#u").send_keys("admin")
# 填写密码
driver.find_element(By.CSS_SELECTOR, "#p").send_keys("123456")
# # 截图保存
# driver.get_screenshot_as_file("qqEmail.PNG")
# 存放在指定目录
driver.get_screenshot_as_file("../image/qqEmail.png")
# 暂停两秒钟
sleep(1)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
七、验证码处理
7.1.概念
一种随机生成的信息(数字、字母、汉字、图片、算术题)
7.2.作用
防止恶意的请求行为,增加应用的安全性
7.3.为什么要学习验证码?
在Web应用中,大部分系统在用户登录注册的时候都要求输入验证码,而我们在设计自动化测试脚本的时侯,就需要面临处理验证码的问题
7.4.验证码的处理方式
1).说明:Selenium中并没有对验证码处理的方法
2).方式:
2.1).去掉验证码(测试环境下-采用--->自己的产品)
2.2).设置万能验证码 (生产环境和测试环境下-采用)
2.3).证码识别技术(通过python-tesseract来识别图片类型验证码;识别率达不到100%)
2.4).记录cookie(通过记录cookie进行跳过登录)
7.5.提示
1).去掉验证码、设置万能验证码:都是开发来完成;
2).验证码识别技术:成功率不高,验证码种类繁多,不太适合;
3).记录cookie:比较实用
7.6.cookie
1).概念
1.1).cookie是由web服务器生成的,并且保存在用户浏览器上的小文本文件,它可以包含用户相关的信息。
1.2).Cookie数据格式:键值对组成(python中的字典)
1.3).Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发-个Cookie数据
1.4).Cookie使用:当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务器检---->查该Cookie,以此来辨认用户状态。
2).作用:标识一次对话的状态 (登录的状态)
3).使用:浏览器自动记录cookie,在下一条请求时将cookie信息自动附加请求
7.7.selenium操作cookie
1).说明:Selenium中对cookie操作提供相应的方法
2).方法
2.1).get_cookie(name)-->获取指定cookie---name:为cookie的名称
2.2).get_cookies()---->获取本网站所有本地cookies(常用)
2.3)add_cookie(cookie_dict)--->添加cookie(常用)----cookiedict:一个字典对象,必选的键包括::"name”and"value'
3).注意
3.1). 以上百度BDUSS所需格式为百度网站特有,别的网站需自行查找
3.2).必须进行刷新操作
4).代码
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://www.baidu.com/")
# 网页最大化
driver.maximize_window()
# 隐式等待 设置十秒钟,抛出异常
driver.implicitly_wait(10)
# 百度cookie:XXX
# 设置cookie
driver.add_cookie({"name":"BDUSS","value":"XXX"})
# # 获取所有cookie信息
# cookies = driver.get_cookies()
#
# # 遍历获取的cookie信息
# for i in cookies:
# print(i)
# 获取单个cookie信息
print(driver.get_cookie("BDUSS"))
# 暂停三秒钟
sleep(3)
# 刷新操作,必须进行刷新才能看到登录效果
driver.refresh()
# 暂停三秒钟
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
八、今日学习思维导图
本文转载自: https://blog.csdn.net/weixin_61319245/article/details/140989655
版权归原作者 开测开测 所有, 如有侵权,请联系我们删除。
版权归原作者 开测开测 所有, 如有侵权,请联系我们删除。