1. 如何搭建UI自动化框架
答:
搭建UI自动化框架时,使用的是PO设计模式,也就是把每一个页面所需要操作的元素和步骤封装在一个页面类中。然后使用Selenium unitest搭建四层框架实现数据、脚本、业务逻辑分离(关键字驱动)。其中四层框架包括基础层、业务逻辑层、数据层、测试用例层。
(1)基础层(BasePage):
设计一个基本的Page类,所有页面皆继承该类。提供一个页面需要实现的基本功能及公共方法。
(2)业务逻辑层(Pages):
按照PO设计模式,将每个页面抽象为一个类,放在Pages包里面,每个页面继承Basepage,可调用Data层数据,包括页面所有的操作对象属性和实现的功能
(3)数据层(Data):
该层存放相关数据,例如:用户数据和密码。在测试用例可通过调用数层的数据来进行操作。
(4)测试用例层(Testcases):
每一个测试用例testcase都对应Pages里面的一个页面,继承unnitest.TestCase类
通过调用对应页面类的方法,数据层的数据、增加断言(assert)来验证功能的正确性。此外通过Jenkins自动执行测试、代码质量检测和部署到测试服务器、部署到生产服务器上
1. UI自动化定位方式有哪些,你在工作中常用的有哪些
答:
By id
By class name
By tag name
By name
By link text
By partial link textzhi
By Css seletor
By Xpath
1. UI自动化时间等待有哪些?区别是什么
答:
sleep()强制等待,设置固定休眠时间,执行sleep( )后线程休眠
而另外两种线程不休眠
隐式等待,是设置的全局等待
显示等待,是针对于某个特定的元素设置的等待时间
1. WebDriver原理是什么
答:
由于客户端脚本(java, python, ruby)不能直接与浏览器通信,这时候可以把Webdriver 当做一个翻译器,它可以把客户端代码翻译成浏览器可以识别的代码(比如js).客户端(也就是测试脚本)创建 1 个 session,在该 session 中通过 http 请求向Webdriver 发送请求,Webdriver 翻译成浏览器懂得脚本传给浏览器,浏览器把执行的结果返回给 Webdriver,Webdriver 把返回的结果做了一些封装(一般都是 json 格式),然后返回给客户端,根据返回值就能判断对浏览器的操作是不是执行成功。
1. Selenium中的Hidden或Display=none元素能否定位
答:
不能
1. 如何提高Selenium脚本执行速度
答:
(1)减少操作步骤,减少脚本用例不必要的步骤
(2)设置等待时间的时候,可以
sleep 固定的时间,也可以检测某个元素出现后中断等待也可
以提高速度
(3)实现多线程。在编写测试用例的时候,一定要实现松耦合,然后在服务器允许的情况下,尽量设置多线程运行,提高执行速度。
1. 如何实现多线程
答:
先写一个run的函数
保证for循环能跑的通-
在run函数上加个装饰器 @threads(n),n是线程数
1. 说一下XPath定位原理
答:
基于html的文档目录结构进行定位元素
1. Selenium工作过程是什么
答:
(1)selenium client(python等语言编写的自动化测试脚本)初始化一个service服务,通过webdriver启动浏览器驱动程序chromedriver.exe
(2)通过RemoteWebDriver向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再对浏览器操作需携带此id
(3)打开浏览器后,所有的selenium的操作(访问地址,查找元素)均通过RemoteConection链接到remote server,然后使用execute方法调用request方法通过urlib3向remote server请求
(4)浏览器通过请求的内容执行对应动作
(5)浏览器再把执行的动作结果通过浏览器驱动程序返回给测试脚本
补充Selenium原理:
我们使用Selenium实现自动化测试,主要需要3个东西
(1)测试脚本,可以是python,java编写的脚本程序(也可以叫做client端)
(2)浏览器驱动,这个驱动是根据不同的浏览器开发的,不同的浏览器使用不同的webdriver驱动程序且需要对应相应的浏览器版本
(3)浏览器,目前selenium支持市面上大多数浏览器,不同的浏览器使用不同的webdriver驱动程序且需要对应的浏览器版本
1. Selenium能否读取excel文件的库
答:
没有,这里需要用到第三方工具。例如Apache POI插件。
1. Selenium有哪些组件
答:
最早的有Selenium IDE,IDE只支持安装在fiefox上一个插件,支持录制自动化脚本。还有
remote RC,和Grid 和webdriver。我们一般最重要的就是使用webdriver。
1. Selenium能否支持Windows桌面应用软件的自动化测试
答:
Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的。
1. 你在原来公司工作中写的测试脚本能在不同浏览器中运行吗?能支持跨浏览器平台吗
答:
是的,我写的测试用例能在IE,火狐和谷歌这三种浏览器上运行。主要是在windows平台上运行脚本,所以mac的safari浏览器暂时没有写过。主要实现这个跨浏览器的思想就是,把浏览器类型写到配置文件,代码里写if语句去判断配置文件的浏览器的类型,来决定用什么浏览器去执行测试用例。
1. 你在自动化工作中,遇到了什么问题
答:
主要有以下几点:
频繁地变更UI,经常要修改页面对象里面代码
运行用例报错和处理,例如元素不可见,元素找不到这样异常
测试脚本复用,尽可能多代码复用
一些新框架产生的页面元素定位问题,例如ck编辑器,动态表格等
1. 举例说一下你在Selenium执行脚本过程中遇到哪些异常
答:
ElementNotSelectableException :元素不能选择异常
ElementNotVisibleException :元素不可见异常
NoSuchAttributeException :没有这样属性异常
NoSuchElementException:没有该元素异常
NoSuchFrameException :没有该frame异常
TimeoutException : 超时异常
Element not visible at this point :在当前点元素不可见
1. 如何处理Alert弹窗
答:
常见的alert弹窗有两种:基于windows弹窗和基于web页面弹窗
我们知道,webdriver是能够处理alert弹窗的,Selenium提供了Alert这个接口。相关操作代码如下:
// 切换到Alert
Alert alert = driver.switchTo().alert();
// 点击弹窗上确定按钮
alert.accept();
// 点击弹窗的取消按钮
alert.dismiss()
// 获取弹窗上线上的文本文字内容
alert.getText();
// 有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入
alert.sendkeys();
1. 在Selenium中如何处理多窗口
答:
需要用到swithTo方法。获取当前浏览器多窗口句柄,然后根据判断跳转新句柄还是旧句柄。
1. 如何处理下拉菜单
答:
通常我们也可以通过Click方法来点击下拉菜单里面的元素,还有一种方法,在Selenium中有一个类叫Select,支持这种下拉菜单交互的操作。
基本使用语法是这样的:
Select Se=new Select(element);
Se.selectByIndex(index);
Se.selectByvalue(value);
Se.selectByVisibleText(text);
1. 你定位的元素有在F12中的控制台,怎么验证定位对不对的呢?用的什么语法
答:
涉及到前端知识,只需要了解即可,ID用"#",其他的用"."
document.querySelectorAll('# ')”;
document.querySelectorAll('. ')”;
当然还有其他的方法验证,可以咨询前端开发
1. quit与close的区别是什么
答:
简单来说,两个都可以实现退出浏览器session功能,close是关闭你当前运行的tab页面,而quit是关闭全部的tab页面,并退出浏览器session。知道这两个区别,我们就知道quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作。
1. 什么是页面加载超时
答:
Selenium中有一个 Page Load wait的方法,有时候,我们执行脚本的速度太快,但是网页程序还有一部分页面没有完全加载出来,就会遇到元素不可见或者元素找不到的异常。为了解决问题,让脚本流畅的运行,我们可以通过设置页面加载超时时间。具体代码是这个:driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);
这行作用就是,如果页面加载超过10秒还没有完成,就抛出页面加载超时的异常。
1. JavaScript Executor是什么,你什么时候用到
答:
JavaScript Executor是一个接口,给driver对象提供一个执行javaScript并访问和修改前端元素属性和值。
还是有比较多的场景,我们可能或者需要借助javaScript来实现:
1.元素通过现有定位表达式不能够实现点击
2.前端页面试用了ck-editor这个插件
3.处理时间日期插件(可能)
4.生成一个alert弹窗
5.拖拽滚动条
基本语法:
JavascriptExecutor js =(JavascriptExecutor) driver;
js.executeScript(Script,Arguments);
1. Selenium中执行用例失败截图你是怎么实现的
答:
在Selenium中提供了一个TakeScreenShot这么一个接口,这个接口提供了一个getScreenshotAs()方法可以实现全屏截图。然后我们通过java中的FileUtils来实现把这个截图拷贝到保存截图的路径。
代码举例:
File src=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
// 拷贝到我们实际保存图片的路径
FileUtils.copyFile(src,new File("C:/selenium/error.png"));
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
如果要实现执行用例发现失败就自动截图,那么我们需要把这个截图方法进行封装。然后在测试代码中的catch代码块去调用这个截图方法。这个我们在POM的框架中一般是把截图方法封装到BasePage这个文件中。
1. Selenium中如何实现拖拽滚动条
答:
在Selenium中通过元素定位会自动帮你拖拽到对应位置,所以是没有自带的scoll方法。但是这个是有限制,例如当前页面高度太长,默认是页上半部分,你定位的元素在页尾,这个时候可能就会报元素不可见的异常。我们就需要利用javaScript来实现拖拽页面滚动条。
我们一般可以两个方法去拖拽,一个是根据拖拽的坐标(像素单位),另外一个是根据拖拽到一个参考元素附件。
代码举例(根据元素坐标拖拽):
JavascriptExecutor jse= (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(0,250)", "");
1. 如何处理不受信任的证书问题
答:
(1)火狐:
/ 创建firefoxprofile
FirefoxProfile profile=new FirefoxProfile();
// 点击继续浏览不安全的网站
profile.setAcceptUntrustedCertificates(true);
// 使用带条件的profile去创建一个driver对象
WebDriver driver=new FirefoxDriver(profile);
(2)谷歌:
// 创建类DesiredCapabilities的对象
DesiredCapabilities cap=DesiredCapabilities.chrome();
// 设置ACCEPT_SSL_CERTS 变量值为true
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
// 新建一个带capability的chromedriver对象
WebDriver driver=new ChromeDriver(cap);
1. 如果登录过程中遇到手机号码或者验证码你是怎么绕过的呢, 或说一下是怎么处理
答:
(1)去掉验证码(测试环境)
这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,线上环境取消注释验证码模块。如果是在测试环境,这样做可省去了测试人员不少麻烦,线上环境若是去掉验证码的话一般是不可取的,线上环境可选择下面的方案二。
(2)设置万能验证码(应该是最佳选择,但是需要开发人员的支持)
去掉验证码的主要是安全问题,为了应对在线系统的安全性威胁,可以在修改程序时不取消验证码,而是程序中留一个“后门”——设置一个“万能验证码” ,只要用户输入这个“万能验证码” ,程序就认为验证通过,否则按照原先的验证方式进行验证。
(3)验证码识别技术
例如可以通过 Python-tesseract等技术来识别图片验证码,Python-tesseract 是光学字符识别 Tesseract OCR 引擎的 Python 封装类。能够读取任何常规的图片文件(JPG, GIF ,PNG , TIFF 等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是 100% 。
目前有很多专门做验证码识别技术的,毕竟术业有专攻,也是不错之选,毕竟自己造轮子不大可取。
(4)记录 cookie
通过向浏览器中添加 cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。
我们可以在用户登录之前,手动登陆,获取cookie,通过 add_cookie()方法将用户名密码写入浏览器 cookie ,再次访问系统登录链接将自动登录。
但是有的Cookie有一个过期时间,一旦再次运行代码时就需要重新获取cookie,也造成一些麻烦。
(5)绕过验证码实例
1. 自动化报告生成你用的什么插件
答:
一般用TestNG原生的测试报告,也有第三方叫reportNG的插件
1. Selenium如何判断元素是否存在
答:
Presense_of_element_located
1. 你自动化用例执行的执行策略是什么
答:
1.自动化测试用例是用来监控的。集成到jenkins,创建定时任务定时执行;
2.有些用例在产品上线前必须回归。jenkins上将任务绑定到开发的build任务上,触发执行;
3.有些用例不需要经常执行。jenkins创建一个任务,需要执行的时候人工构建即可。
1. Selenium需要连接数据库进行数据校验吗
答:
UI自动化不需要
接口测试会需要
1. 如何定位动态变化的元素,假设一个网站每次登陆元素都会变化,你是怎么处理的呢,用什么方法
答:
先去找该元素不变的属性,要是都变,那就找不变的父元素,用层级定位(以不变应万变)
属性动态变化也就是指该元素没有固定的属性值,可以通过:JS实现。通过相对位置来定位。
1. 什么是断言和验证
答:
断言(assert):测试将会在检查失败时停止,并不运行后续的检查
优点:可以直截了当的看到检查是否通过
缺点:检查失败后,后续检查不会执行,无法收集那些检查结果状态
验证(vertify):将不会终止测试
缺点:你必须做更多的工作来检查测试结果:查看日志——>耗时多,所以更偏向于断言。
检查一个条件,如果它为真,就不做任何事,用例通过。如果它为假,则会抛出 AssertError 并且包含错误信息。
1. 自动化测试用例从哪里来的
答:
从手工测试用例中抽取
1. 你觉得自动化最大的缺陷是什么?你们平时工作中是怎么利用自动化的呢?如何不是纯搞自动化测试的情况下
答:
不稳定
可靠性不强
不易维护
成本与收益
平时工作中,我们是先测试部会议讨论哪些业务流程或者需求不经常迭代,在比较稳定的情况下,针对这些需求或业务流程从手工测试用例中抽取部分用例进行脚本编写,这样省去很多时间。
1. 什么是分层测试
答:
(1)数据层
(2)接口层
(3)UI层
1. WebDriver可以用来做接口测试吗
答:
不可以,WebDriver是专门用来做Web的UI自动化参数的
1. 如果在用例执行过程中出现不稳定的情况下,比如这次运行成功,第二次运行失败,你是怎么处理的
答:
1.在经常检测失败的元素前尽量加上显式等待时间,等要操作的元素出现之后再执行下面的操作;
2.多线程的时候,减少测试用例耦合度,因为多线程的执行顺序是不受控制的;
3.多用 try 捕捉,处理异常;
4.尽量使用测试专用环境,避免其他类型的测试同时进行,对数据造成干扰。
1. 写个冒泡排序
答:
代码如下:
public static void bubbleSort(int[] array) {
int temp;
int size = array.length;
for (int i = 0; i < size - 1; i ) {
for (int j = 0; j < size - 1 - i; j ) {
if (array[j] < array[j 1]) {
temp = array[j];
array[j] = array[j 1];
array[j 1] = temp;
}
}
}
}
测试代码:
public static void main(String[] args) {
int[] array = {1, 2, 6, 9, 10};
bubbleSort(array);
System.out.println(Arrays.toString(array));
}
输出结果:
[10,9,6,2,1]
1. 在Selenium自动化测试中,你一般完成什么类型的测试
答:
主要是冒烟测试和回归测试。回归测试主要写一些功能稳定,容易实现的场景,通过自动化手段去实现,节约测试时间。
1. 自动化测试脚本编写规范
答:
(1)基本信息
在每个脚本模块的最上面,必须写上脚本运行的软件和硬件环境(如IE版本、QTP版本、数据库版本等)、外包项目名称、脚本编写人(使用英文名或中文拼音缩写)、脚本创建时间、脚本修改时间、修改说明、输入参数、输出参数、脚本描述等。
(2)常量命名规范
常量的命名应该全部用大写,使用"_"作为单词间的分隔符,单词尽量使用全名称,如,Public Const MSG_EMPTY_ROW As String = "有空行存在"。
使用Public而不是早期版本的global来声明变量。
另外,对常量的声明必须带上类型,如前面的As String。
(3)变量命名规范
变量命名应该简单,应尽量使用缩写。如果是一般的值类型(如integer string),则直接使用变量用途命名。尽量使用全名,例如,Dim name As String;如果是一般的临时性变量定义,应该尽可能地简单,例如,Dim i As Integer;如果名称由多个单词组成,则取每个单词的首字母,如EntityManager缩写为em,ProcedureManager缩写为pm;如果名称由一个单词组成,则对单词进行分段取首字母,如Entity缩写为et。缩写应该控制在3个字母以内,且尽量清晰。
(4)参数命名规范
参数命名的原则是全部用小写,如果参数包括两个或两个以上的单词时,首单词字母小写,其他单词首字母大写,如stepName、stepDescription。
(5)函数命名规范
此处函数包括sub和function,函数表示的是一个动作,所以它的结构应该是动词 名词,动词必须小写,后面的名称首字母大写,如getMaterialCode。函数命名尽量不要使用缩写,而且它的名称应该使人一目了然,能够从名称就知道这个函数的功能,不要使用无意义的函数名称。当函数名称不足以表达其功能时,应使用在函数头部加上让调用者足够明白的注释。
(6)代码注释规范
注释务必做到准确简洁,能够充分表达代码实现的功能。
(7)空行
空行是区分代码块与块的间隔,在函数之间必须加上空行;而在函数内部,变量声明块和实现块(实现块指除变量声明外的其他代码)要使用空行来间隔,实现块的内部,通过空行来标识一个功能段。
(8)缩进
必须严格执行缩进,变量声明块不缩进,实现块必须保证全部缩进(不可能有实现块是行首对齐的);对于基本的控制结构来说,必须要有缩进,如IF、DO、WITH、FOR、WHILE块。
(9)续行
对于过长的语句来说,必须使用续行,续行位置要有明显意义,例如,sql ="SELECT [code],[name] FROM [Person]"_&"WHERE [code] LIKE'001%'"。
另外,还要通过管理对象库来提高代码的可读性,通过修改命名来达到更加易读的效果。对于使用比较频繁的代码块来说,最好将其写成函数,并尽量将功能复杂的大函数拆分成小函数。
注意:在任何地方,不要写ElseIf语句,最好转换成If…Else…Endif结构。
以下个人见解:
(1) 测试脚本的编写规范,包括:
1.1) 文件名、函数、变量、常量等的命名,要易理解、唯一,具有项目、组件、测试目的等特征,具有良好的可读性;
1.2) 脚本编写的一致性、清晰,有足够的注释等。
(2) 自动化测试环境的部署、使用和维护的标准。例如,如何确定测试环境是符合测试设计要求的、谁负责测试环境的维护、谁具有更改环境设置的权限、什么时候更新被测软件包和测试脚本等。
(3)测试脚本的配置管理,包括检入(check-in)、检出(check-out)的要求,以及如何控制脚本的更新、新版本创建、版本的合并等。
(4) 测试脚本的评审方法,可以参照产品源代码的评审方法。
(5) 如何评估自动化测试的结果、如何判断自动化测试是否成功、由谁参与评估等问题。
1. PO设计模式原理?哪些地方可以改善
答:
PO模式全称page object,页面对象模型,将页面的元素定位和元素行为封装成一个page类,实现页面对象和测试用例分离。
改善的话可以对其中对象库层、逻辑层、业务层进行一系列的封装
1. Unittest框架有什么缺点
答:
(1)不够灵活,比如进行UI自动化设计时,会多次打开浏览器,增加脚本运行时间
(2)测试报告不够全面,没有pytest的allure测试报告清晰美观
1. UI自动化测试有哪些缺点?如何改进
答:
不稳定,页面经常变,不好定位,不适合业务复杂和频繁变动的项目
改进:在项目中尽量使用显示等待
1. 如何设计出高质量的自动化测试脚本
答:
(1)使用四层结构实现业务逻辑、脚本、数据分离。
(2)使用PO设计模式,将一个页面用到的元素和操作步骤封装在一个页面类中。如果一个元素定位发生了改变,我们只用修改这个页面的元素属性
(3)对于页面类的方法,我们尽量从客户的正向逻辑去分析,方法中是一个独立场景
(4)测试用例设计中,减少测试用例之间的耦合度。
1. 什么是持续集成
答:
频繁的将代码集成到主干,持续性的进行项目的构架,以便能能够快速发现错误,防止分支大幅度偏离主干。
1. Webdriver协议是什么
答:
WebDrive协议本身是http协议,数据传输使用json
1. 在日历web表单你是如何处理的
答:
首先要分析当前网页试用日历插件的前端代码,看看能不能通过元素定位,点击日期实现,如果不能,可能需要借助javascript。还有些日历控件一个文本输入框,可以直接sendKeys()方法来实现传入一个时间的数据。
1. 如何实现上传文件
答:
在web页面实现文件上传过程中,可以直接把文件在磁盘完整路径,通过sendKeys方法实现上传。如果这种方法不能实现上传,我们就可能需要借助第三方工具,我用过一个第三方工具叫AutoIT.
1. findElement 和 FindElements有什么区别?
答:
两个都是查找元素,都支持八大元素定位方法。findElement()得到的只有一个元素,如果根据提供的元素定位方式找不到,会报noSuchElement异常。
findElements()返回的是一组元素,所以我们需要根据能够找到一组元素的表达式去定位,返回一组元素我们可以放在集合里,这样我们就可以使用集合里面的迭代方法去遍历元素,拿到元素去做其他操作。
1. 查找元素遇到过在Frame里面吗?你是如何处理Frame里面元素定位的
答:
有时候我们知道元素定位表达式没有问题,但是还是提示no such element,那么我们就需要考虑这个元素是否在frame中。如果在,我们就需要从topwindow,通过swithcTo.Frame()方法来切换到目标frame中,可以通过frame的name和id和索引三种方法来定位frame。
1. 什么时候自动化测试
答:
在以下情况下首选自动化:
重复性任务
烟雾和理智测试
使用多个数据集进行测试
回归测试用例
通常,决定基于ROI(投资回报率)
1. 执行自动化测试脚本标准是什么
答:
统一命名约定。
每10行代码3行注释
足够的缩进。
强大的错误处理和恢复方案
尽可能使用框架
1. Selenium与Sikuil区别是什么
答:
Selenium:
它不能自动化视频播放器,音频播放器等闪存对象。
它有复杂的API
它没有视觉匹配
它只能自动化Web应用程序
Sikuli:
它为自动化Flash对象提供了广泛的支持
它有简单的API
它使用视觉匹配来查找屏幕上的元素。因此,我们可以自动化我们在屏幕上看到的任何内容
它可以自动化Web和Windows应用程序
1. 如何保证脚本的有效性
答:
保证定位有效性,封装处理异常,
保证流程有效性,封装独立方法
保证数据有效性,数据备份与恢复
1. 什么是进程、线程、协程
答:
进程:独立数据空间,进程间不共享数据,系统调度。
线程:执行程序的最小单元,进程内线程间共享资源,系统调度。
协程:程序员调度,分解一个线程成为多个"微线程"。
1. 如何判断一个页面上元素是否存在
答:
这个可以说是被问烂的题了,判断元素存在方法有三种:
方法一,用try...except...
Plain Text
def is_element_exsist(driver, locator):
'''
判断元素是否存在,存在返回True,不存返回False
:param locator: locator为元组类型,如("id", "yoyo")
:return: bool值,True or False
'''
try:
driver.find_element(*locator)
return True
except Exception as msg:
print("元素%s找不到:%s" % (locator, msg))
return False
if __name__ == '__main__':
loc1 = ("id", "yoyo") # 元素1
print(is_element_exsist(driver, loc1))
方法二:用elements定义一组元素方法
Plain Text
def is_element_exsist1(driver, locator):
'''
判断元素是否存在,存在返回True,不存返回False
:param locator: locator为元组类型,如("id", "yoyo")
:return: bool值,True or False
'''
eles = driver.find_elements(*locator)
if len(eles) < 1:
return False
else:
return True
if __name__ == '__main__':
loc1 = ("id", "yoyo") # 元素1
print(is_element_exsist1(driver, loc1))
(强烈推荐!)方法三:结合WebDriverWait和expected_conditions判断
Plain Text
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def is_element_exsist2(driver, locator):
'''
结合WebDriverWait和expected_conditions判断元素是否存在,
每间隔1秒判断一次,30s超时,存在返回True,不存返回False
:param locator: locator为元组类型,如("id", "yoyo")
:return: bool值,True or False
'''
try:
WebDriverWait(driver, 30, 1).until(EC.presence_of_element_located(locator))
return True
except:
return False
if __name__ == '__main__':
loc1 = ("id", "yoyo") # 元素1
print(is_element_exsist2(driver, loc1))
1. 一个元素明明定位到了,点击无效也没有报错,你怎么解决
答:
使用js点击,selenium有时候点击元素是会失效
Plain Text
# js点击
js = 'document.getElementById("baidu").click()'
driver.execute_script(js)
1. Selenium中隐藏元素如何定位
答:
网上写的文章都是一堆废话,给面试者看不到重点。
如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了。
元素的属性隐藏和显示,主要是 type=“hidden” 和 style=“display: none;” 属性来控制的,接下来在元素属性里面让它隐藏,隐藏元素可以正常定位到,只是不能操作,操作元素是 click,clear,send_keys 这些方法;
JS 操作隐藏元素;
1. UI自动化中,如何做集群
答:
Selenium Grid,分布式执行用例
Appium 使用 STF 管理多设备
Docker K8S 管理集群
1. 怎么对含有验证码的功能进行自动化测试
答:
让开发写个万能验证码方法,JS语法调用一下
让开发直接把测试环境验证码注释掉,屏蔽
其他操作不推荐