Web自动化测试中处理d出框的相关方法(python语言):
alert = driverswitch_toalert # 获取d出框对象
alerttext # 获取d出框的提示内容
alertaccept() # 点击确定按钮,关闭d出框
全套的课程可以找传智播客的,很多大牛的老师讲的都很全,主要是有配套资料哈。
结合使用driverwindow_handles、driverswitch_to_window(windows[0])、drivertitle、driverswitch_to_window(windows[1])。
如果解决了您的问题请采纳!
如果未解决请继续追问
接上篇
1 显示等待
每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常(TimeoutException)
*** 作格式: WebDriverWait(driver, timeout, poll_frequency=05, ignored_exceptions=None)
WebDriverWait()一般由until()或 until_not()方法配合使用
until(method, message=' ') :调用该方法提供的驱动程序作为一个参数,直到返回值为True
until_not(method, message=' ') :调用该方法提供的驱动程序作为一个参数,直到返回值为False
在本例中,通过as关键字将expected_conditions重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。
expected_conditions类提供的预期条件判断的方法
2 隐式等待
隐式等待是通过一定的时长等待页面上某个元素加载完成。如果超出了设置的时长元素还没有被加载,则抛出NoSuchElementException异常。它的作用范围就是Webdriver对象实例的整个生命周期。
3 强制等待
有时候我们希望脚本在执行到某一位置时暂停一段时间等待页面加载,这时可以使用sleep()方法。
sleep()方法会固定休眠一定的时长,然后再继续执行。sleep()方法默认参数以秒为单位。
年前走查脚本代码时,发现大家对selenium功能都在重复造轮子,而且容易出现一些常见低级bug。于是在闲暇之余,封装一些常用的selenium功能。
在某些网页中,存在多个frame嵌套。而selenium提供的find_element函数只能在当前frame中查找,不能切换到其他frame中,需要从最上级frame中逐步切换(当然也可以指定xpath的绝对路径,但是一般没人这么做)。在我们写代码过程中,需要明确知道当前frame位置和需要寻找元素的frame位置。在frame切换过程中,容易因为疏忽导致frame切换错误导致元素无法找到的bug。
页面中分布的frame,可以理解为树状结构。因此我们可以采用递归的方式, 沿着某条搜索路线frame节点,依次对树中每个节点均做一次访问。
我们以163网址上的登录框为例:点击登录按钮,d出登录iframe页面。输入框位置在iframe中,因此我们不能使用xpath获取元素位置,需要进入iframe中,然后获取元素。
手动切换ifame可能会产生bug,因此需要一套自动切换和检索frame的机制。具体代码如下:
需要注意的是:如果页面中多个frame中,存在相同的xpath元素。还是需要指定frame的路径,否则会返回搜索到的第一个元素。
强制等待
直接调用系统timesleep函数,不管页面加载情况一定会等待指定的时间, 即使元素已被加载 。
1如果设置的时间较长,会浪费时间
2如果设置的时间较短,元素可能没有加载。
页面中某元素如果未能立即加载,隐式等待告诉WebDriver需等待一定的时间,然后去查找元素。默认不等待,隐式等待作用于整个WebDriver周期,只需设置一次即可。
1在上文的find_element函数中,采用递归方式在所有frame寻找元素。若采用隐式等待,则在每个frame中都需要等待设定的时间,耗时非常长。
2某些页面我们想要的元素已经加载完毕,但是部分其他资源未加载。隐式等待必须等待所有元素加载完毕,增加额外等待时间。
显示等待一般作用于某一个元素,在设定的时间范围内,默认每间隔05秒查找元素。返回被加载的元素,若超过设定的时间范围未能查找则报错。显示等待作为selenium常用的等待机制,我们来看下他的源码和机制。
driver 注释中解释为WebDriver实例,但是代码中并未有相关检测,因此可以传入任何对象
但是__repr__函数中使用到session_id属性,如果需要显示属性或者转为str对象,最好在driver对象中添加session_id属性
在until函数中,我们可以看到driver对象传入method函数。在计时结束前,在不断循环执行method函数,如果method函数有正常返回值则退出循环,否则报TimeoutException错误。
可以采用装饰器对隐式等待进行封装,这样代码更加精简
同样的,采用装饰器对其他常用的函数进行封装,例如强制等待、点击、输入文本等。
装饰器虽然很方便,但也会产生一些麻烦。例如在find_element函数递归调用过程中,理应只要执行一次装饰器函数。但因为装饰器已经装饰完毕,导致每次递归都会执行。例如强制等待的sleep函数,如果递归次数越多等待时间越长。
解除装饰器一般有两种做法:一是约定参数,当递归第二次调用时则不生效。例如
这种方式实现简单,容易理解。但是增加了参数限制,在fun函数中就不能使用first_sleep参数。
二是采用装饰器采用wrapped实现,通过访问wrapped属性获得原始函数。例如
但是某一个函数被多个装饰器装饰时,需要递归解除装饰器。例如
最后整体代码如下
这次的封装其实还存在很多问题
1find_element函数不仅仅只是提供查找元素功能,还提供一些其他功能,因此叫element_operation更为合适。
2find_element函数的参数过多,并且很多参数的使用并不在函数本身中,对代码阅读很不友好。
3得小心避免参数重复问题,假设装饰器sleep和装饰器wait_time都使用time这个参数,将无法区分具体是哪个函数使用。
4不利于扩展和维护,当功能过多时find_element的参数过于庞大。
如果只是简单地封装和使用,上面这种方式也能达到较好的效果。如果想进一步封装,建议采用链式调用方式,装饰器辅助封装。例如
这样函数的扩展性和可阅读性有较大的提升
一、什么是Selenium
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
二、selenium基本使用
用python写爬虫的时候,主要用的是selenium的Webdriver,我们可以通过下面的方式先看看SeleniumWebdriver支持哪些浏览器
执行结果如下,从结果中我们也可以看出基本山支持了常见的所有浏览器:
这里要说一下比较重要的PhantomJS,PhantomJS是一个而基于WebKit的服务端JavaScript API,支持Web而不需要浏览器支持,其快速、原生支持各种Web标准:Dom处理,CSS选择器,JSON等等。PhantomJS可以用用于页面自动化、网络监测、网页截屏,以及无界面测试
声明浏览器对象
上面我们知道了selenium支持很多的浏览器,但是如果想要声明并调用浏览器则需要:
from selenium import webdriver
browser = webdriverChrome()
browser = webdriverFirefox()
这里只写了两个例子,当然了其他的支持的浏览器都可以通过这种方式调用
访问页面
from selenium import webdriver
browser = webdriverChrome()
browserget("httiducom")print(browserpage_source)
browserclose()
上述代码运行后,会自动打开Chrome浏览器,并登陆百度打印百度首页的源代码,然后关闭浏览器
查找元素
单个元素查找
from selenium import webdriver
browser = webdriverChrome()
browserget("baocom")
input_first = browserfind_element_by_id("q")
input_second = browserfind_element_by_css_selector("#q")
input_third = browserfind_element_by_xpath('//[@id="q"]')print(input_first)print(input_second)print(input_third)
browserclose()
这里我们通过三种不同的方式去获取响应的元素,第一种是通过id的方式,第二个中是CSS选择器,第三种是xpath选择器,结果都是相同的。
结果如下:
这里列举一下常用的查找元素方法:
find_element_by_name
find_element_by_id
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
下面这种方式是比较通用的一种方式:这里需要记住By模块所以需要导入
from seleniumwebdrivercommonby import By
from selenium import webdriverfrom seleniumwebdrivercommonby import By
browser = webdriverChrome()
browserget("obaocom")
input_first = browserfind_element(ByID,"q")print(input_first)
browserclose()
当然这种方法和上述的方式是通用的,browserfind_element(ByID,"q")这里ByID中的ID可以替换为其他几个
多个元素查找
其实多个元素和单个元素的区别,举个例子:find_elements,单个元素是find_element,其他使用上没什么区别,通过其中的一个例子演示:
from selenium import webdriver
browser = webdriverChrome()
browserget("obaocom")
lis = browserfind_elements_by_css_selector('service-bd li')print(lis)
browserclose()
这样获得就是一个列表
当然上面的方式也是可以通过导入from seleniumwebdrivercommonby import By 这种方式实现
lis = browserfind_elements(ByCSS_SELECTOR,'service-bd li')
同样的在单个元素中查找的方法在多个元素查找中同样存在:
find_elements_by_name
find_elements_by_id
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
元素交互 *** 作
对于获取的元素调用交互方法
from selenium import webdriverimport time
browser = webdriverChrome()
browserget("baocom")
input_str = browserfind_element_by_id('q')
input_strsend_keys("ipad")
timesleep(1)
input_strclear()
input_strsend_keys("MakBook pro")
button = browserfind_element_by_class_name('btn-search')
buttonclick()
运行的结果可以看出程序会自动打开Chrome浏览器并打开淘宝输入ipad,然后删除,重新输入MakBook pro,并点击搜索
交互动作
将动作附加到动作链中串行执行
from selenium import webdriverfrom seleniumwebdriver import ActionChains
browser = webdriverChrome()
url = "ry/tryphpfilename=jqueryui-api-droppable"browserget(url)
browserswitch_toframe('iframeResult')
source = browserfind_element_by_css_selector('#draggable')
target = browserfind_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actionsdrag_and_drop(source, target)
actionsperform()
执行JavaScript
这是一个非常有用的方法,这里就可以直接调用js方法来实现一些 *** 作,
下面的例子是通过登录知乎然后通过js翻到页面底部,并d框提示
from selenium import webdriver
browser = webdriverChrome()
browserget("ucom/explore")
browserexecute_script('windowscrollTo(0, documentbodyscrollHeight)')
browserexecute_script('alert("To Bottom")')
获取元素属性
get_attribute('class')
from selenium import webdriver
browser = webdriverChrome()
url = 'hihucom/explore'browserget(url)
logo = browserfind_element_by_id('zh-top-link-logo')print(logo)print(logoget_attribute('class'))
获取文本值
text
from selenium import webdriver
browser = webdriverChrome()
url = 'com/explore'browserget(url)
input = browserfind_element_by_class_name('zu-top-add-question')print(inputtext)
获取ID,位置,标签名
id
location
tag_name
size
from selenium import webdriver
browser = webdriverChrome()
url = 'com/explore'browserget(url)
input = browserfind_element_by_class_name('zu-top-add-question')print(inputid)print(inputlocation)print(inputtag_name)print(inputsize)
Frame
在很多网页中都是有Frame标签,所以我们爬取数据的时候就涉及到切入到frame中以及切出来的问题,通过下面的例子演示
这里常用的是switch_tofrom()和switch_toparent_frame()
import timefrom selenium import webdriverfrom seleniumcommonexceptions import NoSuchElementException
browser = webdriverChrome()
url = 'oobcom/try/tryphpfilename=jqueryui-api-droppable'browserget(url)
browserswitch_toframe('iframeResult')
source = browserfind_element_by_css_selector('#draggable')print(source)try:
logo = browserfind_element_by_class_name('logo')except NoSuchElementException: print('NO LOGO')
browserswitch_toparent_frame()
logo = browserfind_element_by_class_name('logo')print(logo)print(logotext)
等待
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常, 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
隐式等待
到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行
from selenium import webdriver
browser = webdriverChrome()
browserimplicitly_wait(10)
browserget('com/explore')
input = browserfind_element_by_class_name('zu-top-add-question')print(input)
显示等待
指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果成立就会立即返回,如果不成立,就会一直等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回
from selenium import webdriverfrom seleniumwebdrivercommonby import Byfrom seleniumwebdriversupportui import WebDriverWaitfrom seleniumwebdriversupport import expected_conditions as EC
browser = webdriverChrome()
browserget('taobaocom/')
wait = WebDriverWait(browser, 10)
input = waituntil(ECpresence_of_element_located((ByID, 'q')))
button = waituntil(ECelement_to_be_clickable((ByCSS_SELECTOR, 'btn-search')))print(input, button)
上述的例子中的条件:ECpresence_of_element_located()是确认元素是否已经出现了
ECelement_to_be_clickable()是确认元素是否是可点击的
常用的判断条件:
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 元素加载出,传入定位元组,如(ByID, 'p')
visibility_of_element_located 元素可见,传入定位元组
visibility_of 可见,传入元素对象
presence_of_all_elements_located 所有元素加载出
text_to_be_present_in_element 某个元素文本包含某文字
text_to_be_present_in_element_value 某个元素值包含某文字
frame_to_be_available_and_switch_to_it frame加载并切换
invisibility_of_element_located 元素不可见
element_to_be_clickable 元素可点击
staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
element_to_be_selected 元素可选择,传元素对象
element_located_to_be_selected 元素可选择,传入定位元组
element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
alert_is_present 是否出现Alert
浏览器的前进和后退
back()
forward()
import timefrom selenium import webdriver
browser = webdriverChrome()
browserget('wwbaiducom/')
browserget('aobaocom/')
browserget('wwpythonorg/')
browserback()
timesleep(1)
browserforward()
browserclose()
cookie *** 作
get_cookies()
delete_all_cookes()
add_cookie()
from selenium import webdriver
browser = webdriverChrome()
browserget('om/explore')print(browserget_cookies())
browseradd_cookie({'name': 'name', 'domain': '>
选项卡管理
通过执行js命令实现新开选项卡windowopen()
不同的选项卡是存在列表里browserwindow_handles
通过browserwindow_handles[0]就可以 *** 作第一个选项卡
import timefrom selenium import webdriver
browser = webdriverChrome()
browserget('baiducom')
browserexecute_script('windowopen()')print(browserwindow_handles)
browserswitch_to_window(browserwindow_handles[1])
browserget('baocom')
timesleep(1)
browserswitch_to_window(browserwindow_handles[0])
browserget('honorg')
异常处理
这里只进行简单的演示,查找一个不存在的元素
from selenium import webdriverfrom seleniumcommonexceptions import TimeoutException, NoSuchElementException
browser = webdriverChrome()try:
browserget('ducom')except TimeoutException: print('Time Out')try:
browserfind_element_by_id('hello')except NoSuchElementException: print('No Element')finally:
browserclose()
所有的努力都值得期许,每一份梦想都应该灌溉!
本章节主要内容:
switch_to适用场景:
处理JSd框
切换frame
切换浏览器窗口
Switch_to处理JSd框
JavaScript简称JS,应用于HTML网页,通过 *** 纵网页窗口及网页元素,从而实现动态效果。
JSd框类型:警告框alert、确认框confirm、提示框prompt
浏览器窗口中如果有JavaScript的d出框,需要通过switch_to语句处理。
相关方法:
Switch_to切换窗口
浏览器中有多个窗口时,如果想切换到其他窗口 *** 作,需要调用switch_to方法
切换到目标窗口:
相关方法:
示例:
Switch_to切换frame
如果元素在html的frame或iframe中,则无法直接定位到元素。需要先切换到该frame中,再进行定位及其他 *** 作。
相关方法:
一般来说我们与页面的交互可以使用WebElement的方法来进行点击等 *** 作。但是有时候我们需要一些更复杂的动作,就需要用到我们的Action Chains了。
通过action对象模拟鼠标 *** 作,如双击,右击,拖拽,悬停等 *** 作:
普通键:
有名按键:
无名按键:a-z,0-9
修饰键:
修饰键单独使用没有意义,一般和别的按键配合使用。
Actions *** 作:
使用示例
输入大写或按键上方的字符:
JS,JavaScript的简称,广泛用于HTML网页,通过 *** 纵网页窗口及网页元素,从而实现动态效果。
webdriver无法完成的 *** 作,可以由JS配合完成。
示例:
参考JS:
获取标题:documenttitle
d出提示框:alert('我是一个d框');
改变元素属性:q=documentgetElementById('kw');qstyledisplay='block';
Selenium-JS处理滚动条
通过js实现滚动条拖动效果:
移动元素到窗口顶部:
移动元素到窗口底部:
窗口移动指定距离:
移动窗口到某位置:
input标签上传:借用input元素的sendkeys方法实现
示例:
非input标签上传---借用其他工具如autoIt:
• 用于Windows GUI自动化 *** 作
• 通过它可以组合使用模拟键击、鼠标移动和窗口/控件 *** 作等来实现自动化任务。
• 它使用类似BASIC的脚本语言。
• 可以通过转换工具把脚本转换为exe文件
应用程序从安全考虑,都在登录或某 *** 作节点使用验证码。
验证码是一种区分用户是计算机还是人的公共全自动程序。
自动化时验证码处理方式:
cookie的 *** 作:
Selenium-截图 *** 作
截图:
以上就是关于使用Selenium框架在做Web自动化测试时,如何处理d出框全部的内容,包括:使用Selenium框架在做Web自动化测试时,如何处理d出框、python+selenium点击一个链接,新开一个标签页,怎样将下一步焦点切换到新打开的这个标签页上、selenium显示等待和隐式等待等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)