python+Selenium——web自动化(浏览器对象及页面元素常用操作)
目录等待时间多表单切换frame(iframe)切换窗口切换选择框操作radio选择框checkbox选择框Select选择框鼠标悬停弹出对话框Alert弹出框Confirm弹出框Prompt弹出框截图Cookie操作滚动条等待时间显示等待WebDriverWait()from selenium.webdriver.support.ui import WebDriverWait可以用来检查页面元素
目录
等待时间
在web中因为代码执行速度很快,但由于服务器请求需要时间和网络延迟等原因,在代码执行时,还未能等待页面元素出现就开始执行,这样会使操作不能找到元素使执行失败报错,定位元素的方法为find_element 时抛出异常,定位元素方法为find_elements时,返回空列表,这时可以通过设置等待时间来解决。由于具体的等待时长不好掌握,所以需要设置显示或隐式等待时长来解决。
显示等待WebDriverWait()
设置显示等待需要导入方法
from selenium.webdriver.support.ui import WebDriverWait
方法参数介绍
class WebDriverWait(object):
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
'''
:param driver: 传入WebDriver实例
:param timeout:超时时间,等待的最长时间(同时要考虑隐性等待时间)
:param poll_frequency:调用until中的方法的间隔时间,默认是0.5秒
:param ignored_exceptions:忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等待
'''
隐式等待是对指定元素使用的,在使用的时候通过使用WebDriverWait对象的.until方法来指定需要等待加载的对象,until方法中的参数如下
def until(self, method, message=''):
# method:可执行方法
# message='':超时时返回的信息,可以做断言使用
可以用来检查页面元素是否存在或者是否符合预期
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = (By.ID,'uesrname') # 等待加载成功后的元素作为预期条件
WebDriverWait(driver=wd,timeout=10, poll_frequency=0.5).until(EC.presence_of_element_located(element),message="未找到元素")
user = wd.find_element_by_id('username') # 在上面的等待时间范围内等待加载元素出现的时候执行
expected_conditions条件提供了更多的判断方法
|
ActionChains提供的方法 |
作用 |
|
title_is title_contains |
这两个条件类验证title,验证传入的参数title是否等于或包含于driver |
|
presence_of_element_located presence_of_all_elements_located |
这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行 |
|
visibility_of_element_located invisibility_of_element_located visibility_of |
这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement |
|
text_to_be_present_in_element text_to_be_present_in_element_value |
判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value |
|
frame_to_be_available_and_switch_to_it |
判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement |
|
alert_is_present |
判断是否有alert出现 |
|
element_to_be_clickable |
判断元素是否可点击,传入locator |
隐示等待implicitly_wait()
由于具体的等待时长不好掌握,所以需要设置隐式等待时长来解决。
Selenium的Webdriver对象有个方法叫. implicitly_wait(),该方法接受一个参数,用来指定最大等待时长。在每次代码指定浏览器驱动后,添加这个隐式等待:会根据定位元素方法每隔半秒执行一次,直到找到需要的元素开始执行下一步,除非超出等待的时长而报异常。
强制等待(休眠)
使用time库中sleep方法
多表单切换frame(iframe)切换
在html语法中,frame或iframe是非常特殊一种元素,这种元素内部会包含被嵌套的另一份html文档。当我们操作被嵌入的html文档中的元素时,必须切换到操作范围的嵌入文档内部,不然代码操作是在最外层的html文档中,这样是不能找到需要操作的元素。
switch_to.frame(frame_reference) # 切到指定frame,可用id或name(str)、index(int)、元素(WebElement)定位
switch_to.parent_frame() # 切到父级frame,如果已是主文档,则无效果,相当于后退一层表单
switch_to_default_content() # 切换到主页面,DOM树最开始的frame
切入
切换到frame或iframe元素内部的方法为.switch_to.frame()或.swich_to.iframe()括号里面可以使用frame或iframe元素节点中的id或name属性。但如果节点中没有这两种的属性,就需要使用find方法进行frame或iframe元素定位,括号里面为定位元素的方法嵌套(括号中的参数为find定位到的对象)。
切出
当我们操作完嵌入的html文档后需要在操作其外部的其他元素,就需要切出来再操作,切出嵌套文档的方法为.switch_to.default_content(),这个方法可以跳出到最外层,如果只是想跳到当前一级的父表单,使用switch_to.parent_content(),该方法默认对应于离它最近的swith_to.frame()方法。
窗口切换
在自动化操作的时候,如果我们打开了新的窗口,并且希望在新的窗口进行页面元素的操作,这时在自动化操作的时候,WebDriver对应的还是原来的窗口,无法执行新窗口的操作,所以需要我们在进行窗口切换来实现不同窗口的操作。
WebDriver对象有window_handles 属性,这是一个列表对象,里面包括了当前浏览器中所有的窗口的句柄,我们可以把句柄看作是对应网页的一个id。
窗口打开和切换及句柄获取的方法:
js = 'window.open("https://www.baidu.com")'
wd.execute_script(js) # 运行js代码打开新的网页
wd.window_handles # 获取所有页面窗口的句柄
wd.current_window_handle # 获取当前页面窗口的句柄
wd.switch_to.window(window_name) # 定位页面转到指定的window_name(对应的句柄名)页面
for handle in wd.window_handles: # 使用for循环依次列出所有的窗口句柄
wd.switch_to.window(handle) # 用.window(handle)切换到不同的窗口
if '必应' in wd.title: # 使用if语句判断切换后的窗口标题栏字符串是否是我们需要操作的窗口。
break # 如果是我们期望的窗口就跳出循环
解释:依次获取wd.window_handles里面的所有句柄对象,并且调用 wd.switch_to.window(handle) 方法,切入到每个窗口,然后检查里面该窗口对象的属性(可以是标题栏或地址栏),判断是不是我们要操作的那个窗口,如果是,就跳出循环。可以通过打印切后的窗口标题查看是否切换成功(print(wd.title))。
我们在切换到新的窗口操作完成后需要返回原来的窗口再进行操作,或者某个窗口是我们经常时候使用的,可以使用同样的方法进行切换。当然也可以使用比较简单的方法,就是在切换到新的窗口前先保存原来旧窗口的值,到后面切换回来的时候直接进行调用。
Window_bing = wd.current_window_handle # 将当前窗口的handle存储变量值Window_bing中(这个操作在for循环执行前进行)
wd.switch_to.window(Window_bing) # 在操作完新的窗口后要返回原来窗口时,这时使用窗口切换方法时直接调用原来的变量存储值Window_bing
选择框操作
常见的三种选择框包括:radio框、checkbox框、select框,前两种使用的是input标签,后一种使用的是option标签
radio选择框
是一种单选框,在选择其他其他的选项时,原来的选项自动取消。
所有这种选择框直接执行点击动作即可完成:找到元素后直接使用.click()方法就可以。
checkbox选择框
是复选框,这种选择框在选择时,如果原来有选择的内容,我们需要将原来的选项去掉之后再进行选择。具体操作如下:
1、找到原来已经被选择的选项(根据被选中选项特有的属性值),将其赋值给一个变量列表。
2、通过for循环语句将赋值给变量的列表值取出后进行点击操作后,原来已被选中的选项就会被取消
for element in elements:
element.click()
3、找到要选择的对象进行点击操作。
Select选择框
因为Selenium专门提供了一个Select类,所以在对select选择框进行操作时,需要导入这个类:
from selenium.webdriver.support.ui import Select
对于select选择提供了以下几种选择方法:
- .select_by_value() 根据value属性值选择元素
- .select_by_index() 根据选项的次序(从0开始)选择元素
- .select_by_visible_text() 根据可见文本内容选择元素
- 去除选项的方法就是在上面三种方法中的select前加上de,如果是去除所有的选项就使用.deselect_all()方法。
Select选择框的选择方法有两种,一种是单选,使用上面的方法就可以,另一种是多选,这时我们在选择前要使用.deselect_all()方法先将所有已选择的选项清除后再选择预期的选项。
操作:先将已经选择的找到赋值给变量,让后使用.deselect_all()方法将赋值的变量值内容清除,再开始对预期的选项进行选择。
鼠标悬停
通常在悬停之后要定位悬停元素的,但当我们移动鼠标的时候,悬停的内容会消失,这时我们需要冻结界面。使用的方法是在开发者工具栏 console 里面执行如下js代码
setTimeout(function(){debugger}, 5000)
代码的含义:其中5000代表等待冻结的时间为5000毫秒,在等待5000毫秒后页面会自动冻结(执行debugger命令),这个时间我们可以自己设置,在冻结之前我们可以悬停操作,让悬停的元素出现,等到了5000毫秒界面冻结后再定位元素。浏览器进入debug状态后,因为debug状态下有个特性,界面被冻结后,无法触发点击事件。等到要继续操作页面时,点击页面上的开始按钮:
![]()
弹出对话框
弹出对话框有三种类型:Alert(警告信息)、Confirm(确认信息)、Prompt(提示输入)
这种的对话框不是HTML的内容,是HTML原生的对话框。所以无法通过查找元素来获取弹出对话框的元素内容,在弹出这个对话框的时候,无法再操作界面的其他元素。
这三种弹出对话框的确定方法都是.switch_to.alert.accept()、取消方法是.switch_to.alert.dismiss()、获取弹窗文本内容方法是.switch_to.alert.text
Alert弹出框
显示通知信息,只需要用户浏览完信息后点击OK(确定)
Selenium提供方法是.switch_to.alert.accept()
获取其中的文本内容方法.switch_to.alert.text
Confirm弹出框
是让用户确认是否进行操作,分别为OK(确定)和Cancle(取消)操作
其中OK的操作方法和Alert相同,取消的操作方法为.switch_to.alert.dismiss()
Prompt弹出框
需要用户输入信息后进行确认提交操作
确认提交和取消的方法同Confirm,输入的提交信息的方法为.switch_to.alert.send_keys()
三种对话框的都是通过调用switch_to.alert中的方法,为了使用方便,可以将switch_to.alert赋值给一个变量后直接调用变量。
截图
窗口截图的方法:使用浏览器对象的get_screenshot_as_file()
Wind.get_screenshot_as_file() # 参数为保存图片的路径和图片格式
Wind.get_screenshot_as_png() # 二进制保存图片
Cookie操作
获得所有的cookie信息:get_cookie()
返回字典key为”name”的cookie信息:get_cookie(name)
添加cookie,cookie_dict指字典对象,必须有key和value值:add_cookie(cookie_dict)
删除指定name名称的cookie,optionsString是该cookie的选项,目前包含”路径”,”域”:delete_cookie(name,optionsString)
删除所有cookie信息:delete_all_cookies()
滚动条
webdriver提供了execute_script()方法执行JS代码
其中的参数为window.scrollTo(x,y) ,x和y分别表示窗口滚动条的水平和垂直位置
页面中的textarea文本输入框也是通过借助execute_script()方法输入,而不是send_keys(),其中的参数为”var sum = document.getElementById(‘id’); sum.value = ‘输入内容’;”
更多推荐




所有评论(0)