用旧方法
switch_to_alert()accept()driverswitch_toalert()貌似有点问题,不太了解selenium,要是解决不了我也没辙了。
笔记:
01设置元素等待时间
自动化测试的时候,元素定位没有错,但是跑脚本的时候却报错了
例如,登录的时候要等登录页面加载出来才能输入用户名和密码
selenium设置元素等待时间的3种方式及区别
1sleep() --固定等待时间:强制等待,不能把握准确的等等时间,适合调试时用
2implicitly_wait() --隐式等待时间:等页面加载完成才执行下一步 *** 作,一般设置一次即可
3WebDriverWait --显示等待时间:配合untill()和not untill()方法,根据判断条件 灵活处理等待时间
要先设置一个超长时间,在这个时间内,程序根据调用频率每隔几秒查看一下,如果条件满足,则执行下一步 *** 作,若不满足且超过了等待时间则抛出异常
导包:from seleniumwebdriversupportui import WebDriverWait
使用:WebDriverWait(driver, 超时时间, 调用频率, 要忽略的异常)until(要执行的方法, 超时时返回的错误信息)
实例:
replace:
02键盘事件Keys类
制表符:send_keys(KeysTAB)
退出键:send_keys(KeysESCAPE)
F1:send_keys(KeysF1) f1~f12 以此类推
03二次定位
顾名思义,通过多个元素,定位两次
drfind_element(ByCLASS_NAME,"s_input")send_keys("python")
二次定位:
drfind_element(ByNAME,"query")find_element(ByCLASS_NAME,"s_input")send_keys("python")
04selenium鼠标悬停类-- ActionChains()
导包:from seleniumwebdrivercommonaction_chainsimport ActionChains
实例:将鼠标移动至更多设置,悬停鼠标
elem1= drfind_element(ByLINK_TEXT,"设置")
ActionChains(dr)move_to_element(elem1)perform()
05selenium警告框的处理
很多web应用经常会遇到JavaScript编写的alert 、confirm 以及prompt d窗,需要用到switch_toalert来切换d窗,并对d窗进行输入信息,关闭等处理。
switch_toalerttext --获取d窗文本信息
switch_toalertaccept() --点击d窗中确定按钮
switch_toalertdismiss() --点击d出中取消按钮
switch_toalertsendKeys("字符串") --在d窗中输入信息
实例:
06下拉菜单选择的三种方式
导包:from seleniumwebdriversupportuiimport Select
#选择下拉框的o2
elem1 = drfind_element(ByID,"s3Id")
1:根据value值定位
Select(elem1)select_by_value("o2val")
2根据index定位
Select(elem1)select_by_index(1)
3根据下拉框文本信息定位
Select(elem1)select_by_visible_text("o2")
07多窗口切换
window_handles --获取所有窗口句柄
switch_towindow(指定窗口) --切换到指定窗口
08selenium之JS *** 作浏览器滚动条位置
execute_script("windowscrollTo(0,n);")
09selenium之JS *** 作隐藏元素
隐藏元素的标识:style="display:none;"
一般我们通过将隐藏元素的属性修改成显示再定位
10 *** 作excel文件
将测试数据参数化用到
101准备参数化数据文件
102导包
打开文件,填写文档路径
运行结果:
定位到sheet的位置
读取sheet的行和列的内容
#读取表的行的方法
rows = sheet1nrows
print("行数",rows)
columns = sheet1ncols
print("列数",columns)
读取指定行的值
#读取指定行的值
rowValue1 = sheet1row_values(0)
print(rowValue1)
#读取指定列的值
colValue1 = sheet1col_values(0)
print(colValue1)
#输出所有用户名和对应的密码
for iin range(1,rows):
print("用户名:" + sheet1row_values(i)[0] +",密码:" + sheet1row_values(i)[1])
什么是异常
顾名思义,作为程序员的一种常用术语,“异常”与任何特定的编程语言无关。它属于程序因为突然中止,而未能交付出预期输出的事件。通常,引发异常出现的潜在因素往往来自如下方面:
· Java虚拟内存(JVM)的不足
· 请求访问的文件在目标系统中不存在
· 用户提供了无效的数据
· 在正常的通信过程中突然出现断网
Java中的异常类型
1 已查明的异常(Checked Exceptions):编译器在编译的过程中,会检查到这些异常,并验证它们是否已被处理。如果未被处理,系统会报告编译错误。因此它们被通称为编译时异常(compile-time exceptions)。下面是一些常见的此类异常示例:
· SQLException:程序在基于 SQL 语法执行 数据库 查询时,可能会产生此类异常。
· IOException:程序在文件上执行无效的I/O流 *** 作时,可能会产生此类异常。
· ClassNotFoundException:当JVM无法找到所需的Java类时,可能会产生此类异常。
2 未查明的异常(Unchecked Exceptions):这些异常是在程序的执行期间发生的逻辑错误,因此通常称为运行时异常(Runtime Exceptions)。此类异常在编译时未被检查出来,或者在整个编译过程中已被忽略。下面是一些典型的此类异常示例:
· NullPointerException:当访问具有空值的对象时,可能会产生此类异常。
· ArrayIndexOutofBound:当使用无效的索引值去访问数组时,可能会产生此类异常。
· IllegalArgumentException:当程序将不正确的参数传递给方法时,可能会产生此类异常。
· NumberFormatException:当程序将字符串传递给无法转换为数字的方法时,可能会产生此类异常。
· ArithmeticException:当程序执行不正确的算术运算(例如将数字除以零)时,可能会产生此类异常。
异常处理标准
通过对异常处理能力的提升,我们不仅可以保持代码的整洁,而且能够增强其可维护性、可扩展性和可阅读性。当然,不同的面向对象编程(Object-Oriented Programming,OOP)语言,具有不同的异常处理方法。以下是一些常用的Java异常处理标准:
Try-Catch:该关键字组合可被用于捕获异常。其中,try块应当被放在开头,而catch块应被放在try块的末尾,以便捕获异常,并采取必要的行动。也就是说,我们可以在遇到异常时,创建异常类的对象,以便使用以下预定义的方法,来显示调试信息:
· printStackTrace():该函数可用于打印栈的跟踪、异常的名称、以及其他重要的异常信息。
· getMessage():此函数有助于获取针对异常的深入描述。
try
{
// Code
} catch(Exception e){
// Code for Handling exception
}
同时,Try-Catch块也可以用其他高级方法来处理异常,例如,我们可能希望从单个代码块中捕获多个异常,那么就可以通过在try块之后的多个catch块,去处理不同的异常。而且,我们在try块之后,使用无限数量的catch块。
try
{
//Code
} catch(ExceptionType1 e1){
//Code for Handling Exception 1
} catch(ExceptionType2 e2){
//Code for Handling Exception 2
}
Throw/Throws:如果程序员想显式地抛出异常,那么可以使用throw关键字,与要在运行时处理的异常对象协同使用。
public static void exceptionProgram()throws Exception{
try {
// write your code here
} Catch(Exception b){
// Throw an Exception explicitly
throw(b); }
}
如果开发者想抛出多个异常,则可以通过在方法签名的子句中使用throws关键字来抛出,并且由方法的调用者去进行异常处理。
public static void exceptionProgram()throws ExceptionType1, ExceptionType2{
try {
// write your code here
} catch(ExceptionType1 e1){
// Code to handle exception 1
} catch(ExceptionType1 e2){
// Code to handle exception 2
}
finally:该个代码块往往是在try-catch块之后被创建的。也就是说,无论是否抛出异常,它都会被执行。
try {
//Code
} catch(ExceptionType1 e1){
//Catch block
} catch(ExceptionType2 e2){
//Catch block
} finally {
//The finally block always executes
}
Selenium中的常见异常
WebDriverException定义了Selenium中的多种异常,我们从中选取最常见的异常予以介绍,并配上简单的针对Selenium的异常处理方案:
1 NoSuchElementException
当WebDriver无法定位所需要元素时,Selenium可能会产生此类异常。此处的NoSuchElementException是NotFoundException类的子类,它通常出现在程序使用了无效的定位器时。
此外,如果WebDriver仍然停留在上一页、或正在加载下一页,而所需的定位器已到达了下一页时,就会因为该延迟而出现异常。为此,我们应当通过适当的等待处理 测试 ,最大限度地减少此类异常的发生。
当然,此类异常可以在catch块中被捕获到,并且可以在其中执行所需的 *** 作,以继续完成自动化的测试。例如:
try { driverfindElement(Byid("form-save"))click(); } catch(NoSuchElementException e){
Systemoutprintln(“WebDriver couldn’t locate the element”); }
2 NoSuchWindowException
该异常也是NotFoundException类的子类。如果WebDriver尝试着切换到无效的 浏览器 窗口,那么WebDriver将抛出NoSuchWindowException。因此,要实现窗口切换的好方法是,首先获取活动窗口的会话,然后在对应的窗口上执行所需的 *** 作。例如:
for(String windowHandle : drivergetWindowHandles()){
try { driverswitchTo()window(handle); } catch(NoSuchWindowException e){ Systemoutprintln(“Exception while switching browser window”); }
}
3 NoAlertPresentException
当WebDriver尝试着切换到某个不存在或无效的警报时,Selenium可能会产生此类异常。对此,我建议开发者使用显式、或适当的等待时间,来处理浏览器的各类警报。倘若仍然等不到警报的话,catch块可以捕获该异常。例如:
try {
driverswitchTo()alert()accept(); } catch(NoSuchAlertException e){
Systemoutprintln(“WebDriver couldn’t locate the Alert”); }
4 ElementNotVisibleException
该异常被定义为ElementNotInteractableException类的子类。当WebDriver尝试着对不可见的元素、或不可交互的元素执行各项 *** 作时,Selenium可能会产生此类异常。对此,我建议开发者在的确需要之处,让Selenium进行适当的超时等待。例如:
try { driverfindElement(Byid("form-save"))click(); } catch(ElementNotVisibleException e){
Systemoutprintln(“WebDriver couldn’t locate the element”); }
5 ElementNotSelectableException
该异常属于InvalidElementStateException类的子类。在Selenium中,ElementNotSelectableException表明某个元素虽然存在于网页上,但是无法被WebDriver所选择。
catch块不但可以处理Selenium中的此类异常,而且可以使用相同或不同的 技术 ,重新选择相同的元素。例如:
try {
Select dropdown = new Select(driverfindElement(Byid(“swift”))); } catch(ElementNotSelectableException e){
Systemoutprintln("Element could not be selected")}
6 NoSuchSessionException
Selenium通过driverquit()命令退出自动化的浏览器会话后,以及在调用某个测试方法时,会产生此类异常。当然,如果浏览器崩溃或出现断网,该异常也可能会发生。为了避免出现NoSuchSessionException,我们可以在测试套件结束时,退出浏览器,并确保用于 自动化测试 的浏览器版本的稳定性。例如:
private WebDriver driver;
@BeforeSuite
public void setUp(){ driver = new ChromeDriver(); }
@AfterSuite
public void tearDown(){ driverquit(); }
7 StaleElementReferenceException
当DOM中不再存在程序所需的元素时,Selenium将抛出StaleElementReferenceException。当然,如果DOM未能被正确加载、或WebDriver被卡在错误的页面上时,也可能会产生这种异常。对此,您可以使用catch块捕获该异常,并且使用动态的XPath、或尝试着重新刷新页面。例如:
try { driverfindElement(Byxpath(“//[contains(@id,firstname’)]”))sendKeys(“Aaron”);
} catch(StaleElementReferenceException e){
Systemoutprintln("Could not interact with a desired element")}
8 TimeoutException
当WebDriver超过了执行下一步的等待时限时,Selenium中可能会产生此类异常。Selenium的各种等待通常被用于避免出现ElementNotVisibleException之类的异常。不过,即使在使用了适当的等待之后,如果元素仍然不可交互,那么TimeoutException也会被抛出。为此,我们必须通过执行手动测试,来检验元素的延时性,以便采取进一步的处理等待。
9 InvalidSelectorException
当使用无效的或不正确的选择器时,Selenium中会抛出此类异常。当然,类似情况也可能发生在创建XPATH时。对此,我们需要在将代码推送到主分支之前,检查测试脚本,并测试脚本的端到端流程。此外,SelectorHub和ChroPath等工具,也可以被用于验证定位器。
10 NoSuchFrameException
NoSuchFrameException属于NotFoundException类的子类。当WebDriver尝试着切换到当前网页上无效的、或不存在的框架时,Selenium可能会产生此类异常。为此,我们需要首先确保框架的名称或id是正确的;其次,应确保框架的加载不会过于消耗时间。当然,如果在网页上加载框架的确非常耗时的话,则需要修正相应的等待处理。例如:
try {
driverswitchTo()frame("frame_1"); } catch(NoSuchFrameException e){
Systemoutprintln("Could not find the desired frame")
}
小结
综上所述,为了适应各种场景,异常处理对于任何自动化脚本和逻辑结构都是至关重要的。请您务必在了解每个异常特征的基础上,有选择性地在自动化脚本中使用上述十种有关Selenium的常用异常处理命令。
PhantomJS 和 Chromedriver *** 作方式以及功能一致
主要区别 PhantomJS 无界面模式 节省内存
Chromedriver 完全模仿浏览器 消耗内存
PhantomJS 截取的是网页的完整页面,包括下拉进度条的内容
Chromedriver只截取d框浏览器的可视化内容页面
001 先找到文本输入框元素,输入内容
002 找到搜索按钮 进行搜索
给输入框赋值: elementsend_keys()
*** 作点击事件: elementclick()
find_element和find_elements的区别
带s的返回的是列表
不带s的是返回列表中的第一个元素
selenium处理cookie
页面等待 : >
以上就是关于python+selenium 自动化,出现这个浏览器d框怎么处理全部的内容,包括:python+selenium 自动化,出现这个浏览器d框怎么处理、selenium之webdriver详解——小白进阶之路(二)、你需要知道的有关Selenium异常处理的都在这儿等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)