seo批量建站方法,dede和wordpress哪个安全,哪个网站教做饭做的好,北京移动端网站设计接下来#xff0c;WebUI基础知识最后一篇。
1.下拉框操作
关于下拉框的处理有两种方式
#xff08;1#xff09;按普通元素定位 安装普通元素的定位方式来定位下拉框#xff0c;使用元素的操作方法element.click()方法来操作下拉框内容的选择
#xff08;2#xff09…接下来WebUI基础知识最后一篇。
1.下拉框操作
关于下拉框的处理有两种方式
1按普通元素定位 安装普通元素的定位方式来定位下拉框使用元素的操作方法element.click()方法来操作下拉框内容的选择
2使用Select()类 Select()封装了3种可以查找下拉框选项的方法实现对下拉框选项的选择不用在进行点击动作找到就直接选中了 使用流程 定位到下拉框元素 driver.find_element_by_xxx(XXX) 实例化下拉框选项类 select Select(element) 调用查找方法 select.select_by_index(选项下标) select_by_value(选项的Value值) select_by_visible_text(选项的文本内容) 2.滚动条操作
Selenium没有对于滚动条的相关处理类或者方法但是Selenium提供了其他脚本语言的执行方法所以我们可以使用其他脚本语言来实现对滚动条的操作再使用Selenium的execute_Script()方法调用这个实现语句执行对滚动条的操作。
代码示例
# 导包
from time import sleepfrom selenium import webdriver# 实例化浏览器对象
driver webdriver.Chrome()
# 打开浏览器
driver.get(https://www.baidu.com)
# 展示效果
sleep(1)
# 浏览器窗口最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
sleep(2)
driver.find_element_by_id(kw).send_keys(Test)
driver.find_element_by_id(su).click()
sleep(2)
# 设置JS脚本控制滚动条(左边距,上边距),将JS代码作为字符串,传参给excuse_sctipt()方法
js1 window.scrollTo(0,2000)
js2 window.scrollTo(0,0)
# 执行JS脚本,利用selenium提供的执行脚本方法excuse_script()
driver.execute_script(js1)
sleep(2)
driver.execute_script(js2)
sleep(2)
# 关闭浏览器
driver.quit()
3.弹窗处理
1为什么要进行弹窗处理
在项目中有些特殊页面需要在用户进行了错误操作或遗漏了某些操作时进行弹窗提示。例如博客写完没保存用户就想离开页面会关闭浏览器。
这里说的弹窗是通过页面右键没有检查选项的那种浏览器弹窗如下图。不是指前端写的具备风格的、可以定位到的那种。 当这种弹窗弹出的时候如果不对它进行处理是不可以再继续进行页面操作的不管是选择确认还是选择取消都要处理。
2弹窗有哪几种
警告类alert只是警告用户遗漏了操作用户可以选择继续操作或取消操作留在当前页面
确认类confirm用户进行了有风险的操作或者浏览器想要进行某种操作需要用户允许。
业务流程类需要用户输入内容来判断页面给出哪种操作例如输入密码才能显示某些内容。
3怎样处理弹窗
以上提到的弹窗在Selenium中统一被称为alert类处理思路如下
①将操作对象切换到弹窗上 alert driver.switch_to.alert 提示没有括号
②对弹窗进行操作 alert.text 获取弹窗的文本用作断言 alert.accept() 接受弹窗内容即确认 alert.dismiss() 拒绝弹窗内容即取消
4.切换Frame
1为什么要切换frame
有些项目页面部署分为多个模块每个模块实现不同的功能区通常会把这些模块写成不同的frame。或者在接收到用户的特定操作后弹出一个处理弹窗这个弹窗通常也会写成一个单独的frame。
例如CSDN的登录功能当没有登录的用户在首页点击登录时弹出一个登录窗。在这个登录窗口上右键检查沿层级向上查找我们就可以看到这个窗口全部封装在一个叫做 iframe的模块标签里。 当遇到这类页面时采用普通定位方法去定位元素时我们就会发现写的代码绝对没有问题但是就是找不到报错。就是因为我们在进入页面时操作对象在这个页面的默认frame里不同的frame是存在隔绝的如果页面出现了除了默认frame之外的frame我们在默认frame里是看不到里面的内容的。
2怎样实现frame切换 ①定位iframe找到frame的属性idnamexpath或CSS ②driver.swicth_to.frame(id/name/element) 参数值可以是唯一标识frame的id值、name值、也可以是一个元素对象driver.find_element_by_XXX(XXX)
3多个frame切换时怎样实现
用一个实例理解一下一个页面好比是一栋房子多个frame就像这个房子的多个房间每个房间之间有墙隔开只能通过门相互进出。我们使用get方法打开这个页面就像进入一个房子的时候会默认进客厅一个公共区域在客厅里我们没办法拿到卧室的东西也看不到卧室有什么。想要进卧室拿东西就要打开卧室门进去driver.swicth_to.frame()就是开门进入卧室这个动作。那么我们进入卧室拿到了想要的东西以后还想进厨房怎么办呢就要先从卧室出来回到公共区域在从公共区域打开厨房门进入厨房。
所以当页面有多个frame想要实现两个frame之间的切换就要先从frame回到默认模块driver.switch_to.default_content() 再从默认模块进入另一个frame。
代码示例
# 进入frame1,以下三种写法都可以
driver.switch_to.frame(frame1_id)
driver.switch_to.frame(frame1_name)
driver.switch_to.frame(driver.find_element_by_xpath(//*[frame1_keyvalue]))
# 回到公共区域模块
driver.switch_to.default_content()
# 再进入frame2,写法与进入frame1相同都有三种
driver.switch_to.frame(frame2_id) 5.切换窗口
1为什么要切换窗口 真实的业务流程用户进行了某些操作打开了一个新的标签页接下来的功能要在这个新的标签页中进行。 这些标签页在当前的大多数的浏览器中都看起来是在一个窗口打开的其实这是浏览器提供的显示功能实际上这些标签页每一个都是一个新的窗口只是浏览器为了提升用户体验将它整合显示在了一个窗口内。 用户在真人体验的时候浏览器会自动把新的窗口打开在最上层供用户操作。但是在自动化代码执行时如果我们没有进行窗口切换动作代码的操作对象永远都只能停留在初始页面新打开的窗口内容我们永远无法进行操作。
2怎样实现窗口切换 在这里引入一个句柄的概念句柄是浏览器窗口的唯一标识叫做handle。 既然句柄能唯一标识一个窗口那么我们进行窗口切换的时候就可以使用句柄作为切换的依据。 ①获取当前页面句柄 driver.current_window_handle ,返回值是当前页面的句柄值 ②获取全部页面的句柄 driver.window_handles ,返回值是一个列表列表内容为当前打开的全部页面的句柄值顺序与页面打开顺序相同。 ③因为我们只打开了两个页面不是当前页就是我们要切换的窗口。遍历handles列表判断是否为当前页句柄如果不是则执行切换窗口动作.driver.switch_to.window(handle) ④如果想要切回之前那个页面怎么办呢把现在这个页面当做当前页再执行以上3个步骤就可以了。
3多个窗口之间互相切换要怎样实现
上面我们说的是两个窗口切换如果我们打开了N个页面怎么办呢
我们知道driver.window_handles的返回值是一个列表列表就可以使用下标来获取列表中的值。
利用列表的特性我们就可以知道driver.switch_to.window(handle_list[-1])打开的永远是最新的那个页面driver.switch_to.window(handle_list[0])打开的永远是第一个页面依次类推想要跳转切换到哪一个页面就找到它打开的顺序使用列表定位到它的handle传参给driver.switch_to.window()就可以打开指定页面啦。
代码示例
# 获取当前页面handle并打印出来
print(driver.current_window_handle)
# 获取所有打开窗口的句柄并打印
print(driver.window_handles)# 切换到最新窗口
driver.switch_to.window(driver.window_handles[-1])
# 切换到第一个窗口
driver.switch_to.window(driver.window_handles[0])
# 切换到第四个窗口
driver.switch_to.window(driver.window_handles[3]) # 列表下标从0开始
扩展
如果我们切换到最新页面完成应有的操作之后关闭当前页面再操作其他页面可以直接操作吗
我们可以用以下代码试一下
# 导包
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait# 实例化浏览器对象
driver webdriver.Chrome()
# 打开浏览器
driver.get(https://www.baidu.com)
# 浏览器窗口最大化
driver.maximize_window()
# 隐式等待:通常设置10s
driver.implicitly_wait(10)
sleep(2)# 在百度首页打开新闻页
driver.find_element_by_link_text(新闻).click()
sleep(5)# 切换到新闻页
driver.switch_to.window(driver.window_handles[-1])# 关闭新闻页
driver.close() # 此时百度首页就成了最新的页面我们试一下能不能操作# 在百度首页搜索框输入“test”
driver.find_element_by_id(kw).send_keys(test)
sleep(2)# 关闭浏览器
driver.quit()
执行代码以后我们可以看到代码报错no such window: target window already closed
意思是没有这个窗口目标窗口已经被关闭。
也就是说我们的操作对象还是新闻页没有自动切换到百度首页在新闻页查找百度搜索框但是页面已经被关闭了所以报错 所以即使关闭了当前页再去其他页面进行操作的时候依然要切换。
修改代码如下
# 导包
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait# 实例化浏览器对象
driver webdriver.Chrome()
# 打开浏览器
driver.get(https://www.baidu.com)
# 浏览器窗口最大化
driver.maximize_window()
# 隐式等待:通常设置10s
driver.implicitly_wait(10)
sleep(2)# 在百度首页打开新闻页
driver.find_element_by_link_text(新闻).click()
sleep(5)# 切换到新闻页
driver.switch_to.window(driver.window_handles[-1])# 关闭新闻页
driver.close()
# 切回百度首页
driver.switch_to.window(driver.window_handles[-1])
因为我并没有使用变量接收driver.window_handles的结果每次使用driver.window_handles都会重新获取handle_list跟页面打开与关闭都无关不管之前关闭了多少页面或打开多少新页面driver.window_handles获取的都是在执行这一语句时打开页面的全部句柄# 因为关闭了新闻页所以百度首页就是当前最新的页面所以使用driver.window_handles[-1]可以获取它的句柄
# 因为我们只打开了两个页面百度首页此时既是最新页又是第一个页面。所以driver.window_handles[0]也可以获取它的句柄# 在百度首页搜索框输入“test”
driver.find_element_by_id(kw).send_keys(test)
sleep(2)# 关闭浏览器
driver.quit()6.验证码处理
1直接规避 验证码这个功能本身就是防自动化爬虫的所以自动化测试可以说没啥必要正验证码。一般在测试环境中最简单直接的处理方式就是把这个功能干掉发布之前再加上。 测试环境或者生产内部专用的环境一般都会屏蔽掉这个功能。
2使用万能验证码 如果项目已经上线了不能屏蔽掉验证码功能可以设置的一个万能码。 请开发配合将万能码写在项目验证码的判断逻辑里不管明面上显示的是什么验证码只要输入提前约定的万能码验证都可以通过。 这个方法需要注意的一点就是保证万能码保密不要流出否则会造成巨大损失。 3使用python插件 python有一个测试图片验证码的框架Python_tesseract但是这个图像识别技术并不是100%成功。
4使用cookie绕过验证码 如果不需要测试登录模块我们可以选择绕过登录验证。 客户端登录账号后将登录状态相关的cookie信息,发送给服务器保存, 再次发送请求,携带的cookie信息,如果和登录状态一致,服务器默认登录成功 提前手动登录获取cookie值然后使用这个cookie值绕过登录直接进行功能测试。
如何查看cookie值F12开发者工具-Application-cookie cookie的值具体包含在页面的哪一个字段需要向开发询问或者自行手动登录一下对比登录前后多了哪一个字段。百度的cookie在BDUSS字段。 注意使用cookie时要保证有一个浏览器处于登录项目的状态不能退出一旦退出则cookie失效。任何一个浏览器都可以不一定是我们用来测试的这个只要打开登录着就行。
代码示例
# 实例化浏览器对象
driver webdriver.Chrome()
# 打开浏览器
driver.get(https://www.baidu.com)
# 展示效果
sleep(1)
# 浏览器窗口最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
sleep(2)
# 实现需求
cookie_value {name: BDUSS,value: ZaaVlTRUZ0ZWZaOXBBQ0JZLXV-NDhFQkRhTnhzfmQ1MDFmcWktR3RMeVA0SVpsRVFBQUFBJCQAAAAAAAAAAAEAAAA1c09WwfjD98LlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI9TX2WPU19lak}
driver.add_cookie(cookie_value)
driver.refresh()
sleep(2)
# 关闭浏览器
driver.quit()
好啦关于Web自动化相关的基础知识到这里我们就学习结束啦。后边就是学习测试框架的内容啦。再接再厉哟~~~。
发帖的全部内容是博主自学后整理的笔记如果有错漏希望各位小伙伴指正