python+Selenium——web自动化(浏览器对象及页面元素常用操作)

目录

等待时间

多表单切换frame(iframe)切换

窗口切换

选择框操作

radio选择框

checkbox选择框

Select选择框

鼠标悬停

弹出对话框

Alert弹出框

Confirm弹出框

Prompt弹出框

截图

Cookie操作

滚动条


等待时间

在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选择提供了以下几种选择方法:

  1. .select_by_value()   根据value属性值选择元素
  2. .select_by_index()   根据选项的次序(从0开始)选择元素
  3. .select_by_visible_text()   根据可见文本内容选择元素
  4. 去除选项的方法就是在上面三种方法中的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
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值