阿里测开面试大全(一)附答案完整版

万字长文,建议收藏

1 什么是POM,为什么要使用它?

POM是Page Object Model的简称,它是一种设计思想,而不是框架。大概的意思是,把一个一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为,所以自然而然就用了类的思想来组织我们的页面。一般一个页面写一个类文件,这个类文件包含该页面的元素定位和业务操作方法

为了我们测试用例写的简单,清晰,我们很多时候在页面对象会封装很多业务操作方法,测试脚本只需要调用相关方法就可以。

2如果页面元素经常发生需求变化,你是如何做?

采用POM思想。好处就是只要改一个页面,我就去修改这个页面对象的元素定位和相关方法,脚本不需要修改。

3 在你做自动化过程中,遇到了什么问题吗?举例下

频繁地变更UI,经常要修改页面对象里面代码

运行用例报错和处理,例如元素不可见,元素找不到这样异常

测试脚本复用,尽可能多代码复用

一些新框架产生的页面元素定位问题,例如ck编辑器,动态表格等

4 举例一下你遇到过那些异常,在selenium自动化测试过程中

ElementNotSelectableException :元素不能选择异常

ElementNotVisibleException :元素不可见异常

NoSuchAttributeException :没有这样属性异常

NoSuchElementException:没有该元素异常

NoSuchFrameException :没有该frame异常

TimeoutException : 超时异常

Element not visible at this point :在当前点元素不可见

5 如何处理alert弹窗

我们常见的alert弹窗有两种:基于windows弹窗和基于web页面弹窗

webdriver是能够处理alert弹窗的,Selenium提供了Alert这个接口。

相关操作代码如下:

Alert alert = driver.switchTo().alert() // 切换到Alert

alert.accept() // 点击弹窗上确定按钮

alert.dismiss() // 点击弹窗的取消按钮

alert.getText() // 获取弹窗上线上的文本文字内容

alert.sendkeys() // 有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入

6 在selenium中如何处理多窗口?

这个多窗口之间跳转处理,在实际selenium自动化测试经常遇到。就是,你点击一个链接,这个链接会在一个新的tab打开,然后你接下来要查找元素在新tab打开的页面,所以这里需要用到swithTo方法。

需要获取当前浏览器多窗口句柄,然后根据判断跳转新句柄还是旧句柄

# 最新句柄

current_window_handles = self.driver.window_handles

self.driver.switch_to.window(current_window_handles[-1])

elif window_reference == "default":

self.driver.switch_to.default_content() # 默认当前句柄

else:

self.driver.switch_to.window(window_reference) # 指定句柄

7 你查找元素遇到过在Frame里面吗?你是如何处理Frame里面元素定位的?

有时候我们知道元素定位表达式没有问题,但是还是提示no such element,那么我们就需要考虑这个元素是否在frame中。如果在,我们就需要从topwindow,通过swithcTo.Frame()方法来切换到目标frame中,可以通过frame的name、id和index三种方法来定位frame。

8 如何处理下拉菜单?

通常我们也可以通过Click方法来点击下拉菜单里面的元素,还有一种方法,在Selenium中有一个类叫Select,支持这种下拉菜单交互的操作。

基本使用语法是这样的:

Se=new Select(element)

Se.selectByIndex(index)

Se.selectByvalue(value)

Se.selectByVisibleText(text)

9 关闭浏览器中quit和close的区别?

close是关闭你当前聚焦的tab页面;

而quit是关闭全部浏览器tab页面,并退出浏览器session;

quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作

10 什么是imlicitlyWait(隐式等待)

webdriver 会在指定的超时时间范围内不断的查找元素,直到找到元素或超时

11 什么是expliciteWait(显式等待)

通常是我们自定义的一段代码,这段代码用来等待某种条件发生后,再继续执行后续的代码

12 如何实现文件上传?

我们在web页面实现文件上传过程中,可以直接把文件在磁盘完整路径,通过sendKeys方法实现上传

13 如何实现鼠标悬停,键盘事件和拖拽动作?

在Webdriver中,处理键盘事件和鼠标事件,一般使用Actions类提供的方法,包括鼠标悬停,拖拽和组合键输入。

这里介绍几个方法

方法: clickAndHold()

使用场景:找到一个元素,点击鼠标左键,不放手。自己可以点击鼠标不松开试试这个场景。

方法:contentClick()

使用场景:模拟鼠标右键点击,一般右键会带出菜单来。

方法:doubelClick()

使用场景:模拟鼠标双击

方法:dragAndDrop(source,target)

使用场景:模拟从source这个位置,拖拽一个元素到target位置

键盘事件方法:keyDown(keys.ALT), keyUp(keys.SHIFT)

使用场景:点击键盘事件,分为两个动作,一个点击键盘,第二个动作是释放点击(松开)

14 在selenium自动化测试中,你一般完成什么类型的测试?

主要是冒烟测试和回归测试。回归测试主要写一些功能稳定,容易实现的场景,通过自动化手段去实现,节约测试时间。

15 你是如何管理你的测试用例并执行?

通过单元测试框架实现,常见的有unittest、pytest

16 自动化测试报告生成

Allure

17 你会封装自动化测试框架吗?

自动化框架主要的核心框架就是分层+PO模式:

分别为:基础封装层BasePage,PO页面对象层,TestCase测试用例层。然后再加上日志处理模块,ini配置文件读取模块,unittest+ddt数据驱动模块,jenkins持续集成模式组成。

18 自动化测试有误报过bug吗?产生误报怎么办?

有误报过,有时候自动化测试报告中显示发现了bug,实际去通过手工测试去确认又不存在该bug。

误报原因一般是:

1.元素定位不稳定,需要尽量提高脚本的稳定性;

2.开发更新了页面但是测试没有及时更新维护!

19 自动化测试过程中,你遇到了哪些问题,是如何解决的?

1.频繁地变更页面,经常要修改页面对象类里面的代码

2.自动化测试偶尔出现过误报

3.自动化测试结果出现覆盖的情况:Jenkins根据时间建立文件夹

4.自动化测试代码维护比较麻烦

5.自动化测试进行数据库对比数据

20 在上一家公司做自动化测试用的什么框架?

可以说出以下自己擅长的一种:

1.python+selenium+unittest+htmltestrunner

2.python+selenium+pytest+allure

3.robotframework+Selenium2Library

21 遇到frame框架页面怎么处理?

先用driver.switch_to.frame()跳转进去frame,

然后再操作页面元素,

操作完后使用driver.swith_to.default_content()跳转出来

22 遇到alert弹出窗如何处理?

使用driver.switch_to.alert()方法先跳转到alert弹出窗口

然后再通过accept点击确定按钮;

通过dismiss点击取消难;

通过text获得弹出窗口的文本;

23 什么是断言

断言assert 用于代码中验证实际结果符合预期结果,如果测试用例失败,则抛出异常并且提供断言日志

24 如何提高selenium脚本的执行速度

1、优化等待时间,使用WebDriverWait智能等待代替强制等待sleep和隐式等待imlicitlyWait

2、减少不必要的操作

3、在服务器允许的情况下,使用多线程实现并发执行测试用例

25 怎么对含有验证码的功能进行自动化测试

图像识,难度大,效果不好不推荐

屏蔽验证码,邀请开发处理,在测试环境,预发和正式环境恢复

通过数据库抓取验证码

26 自动化测试分为哪几类

UI自动化:又分为web和和app自动化

接口自动化

27 自动化测试的使用场景?

需求稳定,不会频繁变更。

研发和测试周期长,需要频繁执行回归测试。

需要在多种平台上重复运行相同测试的场景。

某些测试项目,通过手工测试无法实现,或者手工成本太高。

被测软件的开发较为规范,能够保证系统的可测试行

28 请描述一下自动化测试流程?

1.编写自动化测试计划

2.设计自动化测试用例

3.编写自动化测试框架和脚本

4.调试并维护脚本

5.无人值守测试

6.后期脚本维护(添加用例、开发更新版本)

29 一个接口的响应在下一个接口中怎么用?(一个请求依赖另一个请求的返回结果)

cookie 全局变量 反射

存储到excel表,需要时再取

框架里边的期望结果: 查库 依赖用户成功之后

30 web和app自动化有什么不同?

1 启动差别

app端:在执行用例的时候,一部安卓手机同一时刻只能打开一个apk包进行操作

web端:在web端,通过Python多线程(或多进程)同时开启几个浏览器,让selenium对多个浏览器进行操作;

2 安装检查

app端:需要先检查软件是否安装才能进行测试

web端:不需要安装,在浏览器中输入url就可以测试。

3 页面元素操作

app端:需要保证不可见的元素显示在手机页面才能对它进行操作。

web端:如果遇到需要下拉才能加载的页面,可以用js操作滚动条。

4 元素定位

app端:部分定位方式不支持,比如css_selector和link_text

web端:name,id,class_name,css,xpath、link_text、partrail_link_text、tag_name、坐标、图像识别

5 启动方式

app端:需要制定desired_caps内容,因为里面包含了设备信息等。

web端:通过启动webdriver不同的浏览器类,获取driver,如webdriver.Chrome(),也可以模拟手机端加载wap页面做wap页面的测试。

31 unitest和pytest框架讲解以及使用的是哪个一个为什么不用另一个?

较unittest,pytest有以下优点

自动发现测试模块、测试方法

断言使用asert+表达式

可以设置会话级、模块级、类级、函数级的fixtures、数据准备+清理工作

有丰富的插件库,目前在300个以上。

32 分别说出web和app元素定位方法

Web:id、xpath、name、class_name、tag_name、link_text、partial_link_text、css_selector

app: id、classname、xpath

33 get和post不同点

GET - 从指定的资源请求数据。请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接

POST - 向指定的资源提交要被处理的数据。POST请求会把请求的数据放置在HTTP请求包的包体中

34 http和https不同点

1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)

2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

35 selenium原理

当使用 Selenium 2.0 启动浏览器时,后台会同时启动基于 WebDriver Wire 协议的 Web Service 作为 Selenium 的 Remote Server,并与浏览器绑定。之后Remote Server 就开始监听 Client 端的操作请求;

执行测试时,测试用例会作为 Client 端,将需要执行的页面操作请求以 Http Request 的方式发送给 Remote Server 。该 Http Request 的 body,是以 WebDriver Wire 协议规定的 JSON 格式来描述需要浏览器执行的具体操作;

Remote Server 接收到请求后,会对请求进行解析,并将解析结果发给 WebDriver,由WebDriver 实际执行浏览器的操作;

WebDriver 可以看做是直接操作浏览器的原生组件(Native Component),所以搭建测试环境时,通常都需要先下载浏览器对应的 WebDriver。

源代码:通过 subprocess.Popen 启动 chromedriver.exe 程序,从而提供服务

driver.get, driver.find_element 等方法底层都调用 self.execute方法, 而最终都是去访问 chromedriver 提供的接口地址

36 appium原理

开源、跨平台的UI自动化测试工具,支持多种语言编写的测试脚本

原理:

test scripts(测试脚本发送一个请求到appium server)

appium server接收到请求后进行解析并把请求转发给 bootstrap.jar。

jar接收到appium的命令,调用UIAutomator命令实现操作

最终结果由bootstrap.jar返回给Appium server。

37 android和iOS自动化实现原理的区别(安装环境区别)

都需要安装 jdk、nodejs、appium、appi-client

appium自动化原理:

Appium提供各个语言的第三方库,将测试脚本转化成 WebDriver 协议下的 URL,通过 Node 服务发送到各个平台上的代理工具,代理工具在运行过程中不断接收 URL,根据 WebDriver 协议解析出要执行的操作,然后调用各个平台上的原生测试框架完成测试,再将测试结果返回给 Node 服务器。

appium android自动化原理是:

google官方sdk自带了一个操作APP的UI的框架叫做uiautomator,然后appium初始化的时候,就会推送一个bootstrip.jar推送到手机,然后appium client发送请求到appium server,然后server发送到bootstrip.jar,bootstrip.jar调用uiautomator接口,由uiautomator驱动APP的UI界面操作,然后bootstrip.jar返回操作的结果给appium server

appium ios原理:

appium在iOS上的实际上就是使用了WebDriverAgent,作为实现webdriver协议的驱动层,通过驱动苹果的UIAutomationUI框架完成iOS的自动化

38自动化测试用到的模块

requests+unittest+ddt+httptestrunner+pymysql+openpyxl+logging 接口自动化

selenium+pytest+allure web自动化

appium+selenium+pytest+allure+yaml app自动化

39 OSI七层模型

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

40 cookie、session、token各自区别

cookie:在客户端存储在客户端用于存储会话信息的

session:在服务器端,记录用户的请求状态,一般默认时间30min

session_id会存在cookie中,每次请求cookie中所有信息都会传递给服务器,服务器通过 session_id来识别是否是同一个用户请求,不是同一个用户的话,就会要求重新登录

token:访问权限

鉴权:访问的接口是否正常,是否非法访问绕过前端。防止跳过页面直接访问接口。token

授权:是否具有访问接口的权限。 唯一全局动态的 。key

41 常用状态码

100系列:请求已收到继续处理;

200系列:表示成功

200:正常,服务器正确响应了请求

300系列:资源重定向;

301:永久重定向;请求的网页已永久移动到新位置

302:2临时重定向;被请求文档已经临时移至别处,此文档新的url在location响应头中给出

303:浏览器对于POST的响应进行重定向至新的url

307:浏览器对于GET的响应重定向至新的url

400系列:客户端错误:

400:错误请求;服务器不理解请求的语法。

401:未授权;如请求参数、方法、格式等

403:拒绝访问;服务器理解客户的请求,但拒绝处理它(没有权限)

404:请求资源不存在

500系列:服务器端出错

500:服务器内部错误

501:尚未实施;服务器不具备完成请求的功能

502:服务器网关错误

503:服务器由于维护或者负载过重未能应答

504请求超时

42 手写adb命令

adb 帮助:adb --help

启动adb 服务:adb start-server

关闭adb 服务:adb kill-server

获取设备号:adb devices

获取系统版本:adb shell getprop ro.build.version.release

发送文件到手机:adb push 电脑端⽂件路径/需要发送的文件 手机端存储的路径

adb push C:\Users\win\Desktop\xx.png /sdcard

从手机拉取文件: adb pull 手机端的路径/拉取文件名 电脑端存储文件路径

adb pull /sdcard/xx.png C:\Users\win\Desktop

查看手机运行日志: adb logcat

进入到手机终端: adb shell

安装app到手机: adb install 路径/xxx.apk

卸载手机app : adb uninstall app

获取app启动包名和启动名(⚠手机需要先打开对应app)

Mac/Linux: adb shell dumpsys window windows | grep mFocusedApp

在 Windows 终端运⾏: adb shell dumpsys window windows | findstr mCurrent

获取app启动时间: adb shell am start -W 包名/.启动名

查看设备ip地址:

adb shell ifconfig wlan0

adb shell netcfg

查看设备cpu信息: adb shell cat /proc/cpuinfo

查看设备内存信息: adb shell cat /proc/meminfo

43 http请求头和响应头

http请求及其结构:

请求信息包含:请求行(request) 请求头部header 、空行和请求数据组成

响应及其结构

响应组成:状态行、响应头报头、空行和响应正文

44 鼠标操作常用函数

context_click() 右击 --> 此方法模拟鼠标右键点击效果

double_click() 双击 --> 此方法模拟双标双击效果

drag_and_drop() 拖动 --> 此方法模拟双标拖动效果

move_to_element() 悬停 --> 此方法模拟鼠标悬停效果

perform() 执行 --> 此方法用来执行以上所有鼠标方法

45 键盘操作常用函数

send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

send_keys(Keys.SPACE) 空格键(Space)

send_keys(Keys.TAB) 制表键(Tab)

send_keys(Keys.ESCAPE) 回退键(Esc)

send_keys(Keys.ENTER) 回车键(Enter)

send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)

send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)

send_keys(Keys.CONTROL,'v') 全选(Ctrl+V)

send_keys(Keys.CONTROL,'x') 复制(Ctrl+X)

46 解决手动造数据问题

参数化

手机号:

excel里边存放初始手机号 每次执行完,回写新的手机号(原来号码+1)

每次从数据库里查询最大手机号,在这个基础上加1

变量替换: 数据库依赖关系 ${mobile} ${regtime} ${memberid} ${loanid}

最关键:用例设计、用例参数之间依赖关系

47 你写框架多长时间?

初步模型:1-2周,一个月时间

48 TestCase使用

导入unittest模块、被测文件或其中的类

创建一个测试类,并继承unitest.TestCase

定义测试函数,函数名已test_开头,测试用例

调用unittest.main()方法运行测试用例

49 Selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元素一 定是可以点击的?

1.添加元素智能(隐性)等待时间 driver.implicitly_wait(30)

2.添加强制等待时间 time.sleep()

3.try 方式进行id,name,clas,xpath, css selector不同方式进行定位,如果第一种失败可以自动尝试第二种

50 你的自动化用例的执行策略是什么?

利用自动化测试工具,经过测试需求分析;

设计出自动化测试用例;

从而搭建自动化测试的框架,设计与编写自动化脚 本;

验证测试脚本的正确性,最终完成自动化测试测试脚本(即主要功能为测试的应用软件)

输出测试结果

51 常见的 POST 提交数据方式

主要有四种方式:

application/x-www-form-urlencoded;

multipart/form-data;

application/json;

text/xml

52 目前主流的APP自动化测试框架,各个自动化适合的语言

appium macaca、robotium、UiAutomator

53 Selenium有哪几种定位方式?用的最多的是哪种?

8种单元素定位方法,8种对应的多元素定位方法;所有方法都是基于driver.find_element()和driver.find_elements()方法,如下:

from selenium import webdriver

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('www.baidu.com')

driver.find_element_by_id('id') # 通过元素id属性定位元素

driver.find_element_by_name('name') # 通过元素名字属性定位元素

driver.find_element_by_tag_name('tag_name') # 通过元素的标签名称定位元素

driver.find_element_by_class_name('class_name') # 通过元素的类名称定位元素

driver.find_element_by_link_text('link_text') # 通过链接元素的完整显示文字定位元素

driver.find_element_by_partial_link_text('partial_link_text') # 通过链接元素的部分显示文字定位元素

driver.find_element_by_xpath('xpath') # 通过xpath表达式定位元素

driver.find_element_by_css_selector('css_selector') # 通过css表达式定位元素

driver.find_elements_by_id('id') # find_elements_by_xxx系列也有8种,可以定位多个满足条件的元素

driver.find_element(By.ID, 'id') # 每一个find_element_by_xxx方法都是基于find_element方法的

driver.find_elements(By.ID, 'id') # find_element()方法的复数形式,可以定位多个满足条件的元素

为了保证代码的统一性,使用的最多的是driver.find_element_by_xpath()这个方法,传入定位器,即使我们使用id作为定位器,仍然写成基于id的xpath定位器表达式,如下:

baidu_yi_xia_locator = ‘//input[@id="su"]’ # 百度一下按钮的定位器,写成了xpath,但基于的是id这个属性

baidu_yi_xia = driver.find_element_by_xpath(baidu_yi_xia_locator) #定位元素,并返回给变量

baidu_yi_xia.click() # 点击百度一下

54 UI自动化能发现多少Bug

UI自动化的目的不是为了发现多少Bug,主要是为了减轻重复的基础操作和线上监控的作用

55 monkey属于自动化吗?

monkey不属于严格意义上的自动化,monkey是生成用户或系统的伪随机事件,在屏幕上触发随机点击事件

56 你们一般对什么case会进行自动化,自动化一般在哪个阶段进行

主要是主流程中比较容易实现的进行自动化,一般在集成阶段进行该版本的自动化监控,平常的话会一直跑线上监控的

57 app自动化你们一般用什么工具定位元素?

Uiautomatorview和appium的客户端

58 您需要一台服务器机器来运行Appium上的测试吗?

不需要服务器机器在Appium上运行测试。 Appium促进了一个2层架构,其中测试机连接到运行Appium的测试服务器并自动化整个事情。您可以在运行测试的同一台机器上运行Appium。

59 使用Appium可能遇到的错误是什么?

错误1:需要以下所需的功能,但不提供:设备名称,platformName

错误2:找不到adb。请使用Android SDK根目录路径设置ANDROID_HOME环境变量

错误3:openqa.selenium.SessionNotCreatedException:无法创建新的会话

错误4:如何在移动应用程序中查找DOM元素或XPath?

60 简述Appium的原理?

Appium是使用Node.js平台编写的“HTTP Server”,并使用Webdriver JSON线协议驱动iOS和Android会话。

在初始化Appium Server之前,必须在系统上预先安装Node.js 当Appium被下载并安装时,在我们的机器上设置一个暴露REST API的服务器

它从客户端接收连接和命令请求,并在移动设备(Android / iOS)上执行该命令,

它响应HTTP响应。

再次,为了执行此请求,它使用移动测试自动化框架来驱动应用程序的用户界面。 框架像Apple Instruments for iOS(仅适用于Xcode 3.0或更高版本的OS X v10.5及更高版本)适用于Android API的Google UIAutomator 16级或更高版本Selendroid for Android API等级在15以下。

61 如何提高selenium脚本的执行速度?

如网速、操作步骤的繁琐程度、页面加载的速度、在脚本中设置的等待时间、运行脚本的线程数等。所以不能单方面追求运行速度的,要确保稳定性,能稳定地实现回归测试才是关键。

减少操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。

中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。

在设置等待时间的时候,可以sleep固定的时间,也可以检测某个元素出现后中断等待也可以提高速度。

四,配置testNG实现多线程。在编写测试用例的时候,一定要实现松耦合,然后在服务器允许的情况下,尽量设置多线程运行,提高执行速度。

62 什么是持续集成?

持续集成源于极限编程(XP),是一种软件实践,软件开发过程中集成步骤是一个漫长并且无法预测的过程。集成过程中可能会爆发大量的问题,因此集成过程需要尽可能小而多,实际上持续集成讲的是不断的去做软件的集成工作。持续集成,最简单的形式是包括一个监控版本控制(SVN等等)变化的工具。当变化被发觉时,这个工具可以自动的编译并测试你的应用

63 什么是page object设计模式?

通过分离测试对象和测试脚本的抽象来实现的

64 你觉得自动化测试最大的缺陷是什么?

不稳定

可靠性

不易维护

成本与收益

65 Selenium是否支持桌面应用软件的自动化测试。

Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的。

66 BDD是什么?你了解多少?TDD是什么?

BDD:行为驱动开发(Behavior Driven Development)

TDD:测试驱动开发(Test-Driven Development)

67 selenium是否可以直接读取Excel表中测试用例,来执行相关测试

可以的,需要借助第三方库

68 Selenium有哪些组件?

最早的有Selenium IDE,IDE只支持安装在fiefox上一个插件,支持录制自动化脚本。还有

remote RC、Grid 、webdriver。我们一般最重要的就是使用webdriver。

69 如果元素定位中遇到iFrame内嵌框架,你是如何定位的?如果没有遇到id属性和name属性为空的情况,又是如何处理的?

第一个问题:遇到iFrame内嵌框架里的任何元素,和以往一样写出定位器就可以了,只是在执行脚本的时候,定位器是正确的,但是仍然脚本执行失败,报错“无法找到元素”。原因就是因为这个元素被嵌在了iFrame内嵌框架中(我们也叫子框架),所以需要在定位元素前,先写以下代码,作用是从当前的主框架切换到内嵌框架中,有多种方式:

# 切入frame有3种方式

# (1) 通过frame的id属性或name属性

driver.switch_to.frame('layui-layer-iframe1')

# (2) 通过frame的index,从0开始(第1个iframe)

driver.switch_to.frame(0)

# (3) 通过定位器,配合find_element()方法,定位到框架元素后,再把这个定位到的框架元素入参iframe_loc = '//iframe[@id="layui-layer-iframe1"]'

driver.switch_to.frame(driver.find_element_by_xpath(iframe_loc))

第二个问题:没有id或者name属性,只需要用xpath写出表达式,表达式中利用元素的其他单个或多个属性的组合,只要能够保证元素的唯一性即可,如下例子:

//input[@value="百度一下"]

70 明明自己定位的元素是对的,执行自动化测试脚本时却报错,这时你有几种方法解决此问题?请写出你的解决方法。

(1)元素在iFrame里:先切入iFrame

(2)元素在打开的新窗口里:先切入新窗口

(3)元素在新跳转的页面里,但是因为各种原因,新页面跳转很慢,已经超过了Selenium中对于元素定位的最大等待时间:增加隐式等待时间或对这个元素进行智能等待

隐式等待的代码如下:

from selenium import webdriver

driver = webdriver.Chrome()

# 设置全局等待(即:隐式等待),注意只需要设置一次

driver.implicitly_wait(60) # 延长到60秒

显示等待(智能等待)的代码如下:

from selenium import webdriver

from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

mobile_phone_loc = (By.XPATH, '//input[@name="mobilephone"]')

elem = WebDriverWait(driver, 60).until(EC.element_to_be_clickable(mobile_phone_loc))

elem.send_keys('13812345678')

71 简单说出如何用自动化测试脚本实现遍历复选框点击功能(要求全部勾上)。

xPathRadio = '//input[@type="radio"]'

# radiobox复选框对象我们必须使用find_elements方法去定位多个元素(复选框就是多元素)

radioboxes = driver.find_elements_by_xpath(xPathRadio)

# 使用循环遍历的方式,逐个点击这些定位到的元素

for radiobox in radioboxes:

radiobox.click()

72 写一个自动化脚本,语言不限,要求每执行一次脚本随机生成一个手机号码。

import random # 导入随机数模块

# 一开始,手机号是空的

mobile_phone = ''

# 在中国,手机号码的第一位都是1

phone_num_1 = '1'

# 把第一位生成的数字拼接到手机号

mobile_phone = mobile_phone + phone_num_1

# 根据不同的运营商,手机号码的第2位和第3位都是有固定值的,这里随便列举了几个,放入列表

phone_num_2_to_3 = ['38', '82', '88', '36', '30']

# choices方法可以随机抽取列表里的元素,从而生成第二三位手机号码,并拼接到手机号

phone_num_2_to_3 = random.choices(phone_num_2_to_3)[0]

mobile_phone = mobile_phone + phone_num_2_to_3

# 最后8个数字,循环生成

for i in range(8):

# randint方法可以随机产生0~9的值,但是为了拼接字符串,我们用str()方法转换

phone_num = str(random.randint(0, 9))

# 每一次循环都会生成一个数字,并且继续拼接到现有的电话号码里

mobile_phone = mobile_phone + phone_num

# 打印最终生成的手机号码

print(mobile_phone)

73 你对单元测试框架了解多少

unittest、testng、nose、pytest、

74.深拷贝和浅拷贝的区别?

浅拷贝:浅拷贝是对于一个对象的顶层拷贝。简单理解:拷贝了引用,并没有拷贝内容(对象)

深拷贝:对于一个对象所有层次的拷贝(递归)

全都是不可变类型的数据:copy.copy、copy.deepcopy都是引用指向

包含不可变类型的数据:deepcopy是深拷贝,copy.copy是指向引用

不可变对象中包含可变对象:copy.copy是引用指向,deepcopy是开辟新的内存地址,即深层拷贝

75 web/app动态元素如何定位

对于属性值动态:

用xpath+模糊匹配定位方式:

driver.find_element_by_xpath(“//标签名[contains(@属性,‘部分片段值’)]”)

driver.find_element_by_xpath(“//标签名[starts-with(@属性,‘头部片段值’)]”)

driver.find_element_by_xpath(“//标签名[ends-with(@属性,‘尾部片段值’)]”)

属性可以为 id、name、tag_name、link_text、partial_link_text等

用模糊组合定位:

driver.find_element_by_xpath(“//标签名[contains(@属性1,‘片段值’) and @属性2=‘属性值’ and …]")

位置动态:

采用兄弟节点/父子节点方式定位

//*[contains(@resource-id,"fixedWrap")]//*[@content-desc="自选"]

//android.widget.LinearLayout[contains(@resource-id,"home_item_layout_bg") and @index="1"]

//*[contains(@resource-id,"myfund_name_text_view") and @text="${fund_name}"]/../..//android.widget.LinearLayout[1]

76 没有找到元素的原因可能是什么?

元素定位表达式写错

定位的元素属性值会动态发生变化

解决方案:

1)通过数据库查询属性值再动态传入

2)组合定位:兄弟节点、父子节点、子孙节点方式

3) 模糊定位方式:starts-with、ends-with、contains(参考75)

元素没加载

解决方法:全局加隐式等待

self.driver.implicitly_wait(time_to_wait=5)

元素在适当位置添加显示等待:

WebDriverWait(self.driver, timeout).until(EC.element_to_be_clickable(locator)) #元素是否可点击

WebDriverWait(self.driver, timeout).until(EC.visibility_of_element_located(locator)) #元素是否可见

WebDriverWait(self.driver, timeout).until(EC.presence_of_element_located(locator)) # 元素是否存在

页面加载慢,添加强制等待

元素不在该页面

切换到iframe(id、name、index方式)再处理元素

window(句柄切换:self.driver.switch_to.window(current_window_handles[-1]))

alert(先切换到alert(self.driver.switch_to.alert)

77 验证码如何处理

元素滑动方式:

定位滑块–>模拟单击滑块,让拼图和缺口显现出来–>获得缺口位置–>计算需要滑动的距离–>通过ActionChains函数滑动滑动

通过opencv库计算阀值匹配背景和缺口(推荐)

参考:https://segmentfault.com/a/1190000019218588

78 ui自动化中登录如何处理

在conftest.py中定义fixture夹具,在对应测试用例调用

@pytest.fixture()

def driver():

global d

d = webdriver.Chrome()

d.implicitly_wait(5)

d.maximize_window()

yield d

d.quit()

@pytest.fixture()

def login(driver): # 调用fixture时一定要在定义函数中传入driver,否则报错

lg = LoginPage(driver)

lg.login('1a2b','abcd')

time.sleep(5)

return driver

def test_xxxx(self, login): # 调用login

driver = login

page = LoginPage(driver)

79 字典里嵌套字典或列表,如何获取值?

通过re.search()方法

import re

import json

res = {'code': 0, 'success': True, 'data': {

'result': {'isSucceed': True, 'message': '44704', 'mdmId': 0, 'setMessage': True, 'setIsSucceed': True,

'setMdmId': False}}, 'msg': None}

res= json.dumps(res)

info = re.compile(r'"message": ".*?"')

print(info.search(res).group().split(":")[1].strip(' ,"'))

# code = re.search(r'"message": ".*?"',res)[0].split(":")[1].strip(' "')

# print(code)

80 docker怎么用(常用命令)

镜像:

启动docker:sudo systemctl start docker

镜像查看:docker images

删除镜像:

docer image rmi image ID

docker image rm 镜像版本号:标签名

容器:

启动容器:

docker run imagename

docker run -dit 镜像版本名:标签名 /bin/bash

指定端口和数据卷:docker run -dit --name 容器名称 -v 宿主机目录:容器目录 -P 宿主机端口:映射端口 镜像名称

进入容器:docker exec -it 容器名 /bin/bash

列出系统中所有容器:docker ps -a

停止容器:docker stop containerID

重启容器:docker restart 容器名(容器id)

删除容器:

删除一个正在运行容器(强制删除): docker rm -f containerID

docker rm containerID

查看容器日志:docker container logs container_id

81 微信小程序怎么实现自动化?

连接真机:开启usb调式模式

打开x5内核调试模式:http://debugmm.qq.com/?forcex5=true

Android Screen Monitor 显示真机屏幕

核心配置参数

desired_caps["recreateChromeDriverSessions"] = True # 支持X5内核应用自动化配置

desired_caps["chromedriverExecutableDir"] = r'D:\xxxx\chromedriver' # 指定driver版本

desired_caps["chromeOptions"] = {"androidProcess": "com.tencent.mm:appbrand0"}

82.字符串怎么转字典

s = '{"name":"zhangsan","age":13,"sex":"男"}'

# 法1 json.loads()

import json

# print(json.loads(s))

# 法2:eval()

# print(eval(s))

# 法3 : ast.literal_eval()

import ast

print(ast.literal_eval(s))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS Ajax 封装

ajax 封装 一、 什么是Ajax?二、 Ajax的优缺点?2.1 优点2.2 缺点 三、 Ajax的使用3.1 状态码3.2 xhr的基本使用3.3 ajax原生封装:3.3.1 触发GET请求:3.3.2 调用POST请求: 四、Ajax的约束 一、 什么是Ajax? …

【新版】系统架构设计师 - 案例分析 - 数据库设计

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 数据库设计数据库基础数据库设计概述E-R模型概念结构设计逻辑结构设计规范化(范式)反规范化技术数据库事务并发控制索引视图物化视图存储过程触发器数据库性能优…

【Spring Cloud系列】Feign详解与实战

Feign详解与实战 文章目录 Feign详解与实战一、概述二、什么是Feign三、Feign特性四、Feign简单使用3.1 Feign使用步骤3.2 Feign具体使用1. 引入依赖2. 启动类上添加注解3.编写FeignClient接口 五、使用Feign发起http请求5.1 Maven导入Feign配置,并集成Jackson5.2 F…

基于matlab实现的光折射反射(不同界面)程序

完整程序: %平面电磁波在不同介质界面上入射、反射、折射仿真 %ReadMe!!!在下述说明的用户输入区内输入入射角和两介质折射率, %输出反射折射示意图与反射折射系数随入射角变化的曲线 %—————————————————————————————————————…

百度SEO优化TDK介绍(分析下降原因并总结百度优化SEO策略)

TDK是SEO优化中很重要的部分,包括标题(Title)、描述(Description)和关键词(Keyword),为百度提供网页内容信息。其中标题是最重要的,应尽量突出关键词,同时描述…

9.20 QT作业

widget.h #include <QPainter> //画家 #include <QTimerEvent> #include <QTime> #include<QTimer> //定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widge…

性能测试之使用Jemeter对HTTP接口压测

我们不应该仅仅局限于某一种工具&#xff0c;性能测试能使用的工具非常多&#xff0c;选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验&#xff0c;也算略有小成&#xff0c;任何性能测试&#xff08;如压力测试、负载测试、疲劳强度测试等&#…

SAP DN已发货但是需求还挂在MD04上的异常处理(SE38执行程序:ATP_VBBE_CONSISTENCY OR SDRQCR21)

背景&#xff1a;DN 80074061已经发完货&#xff0c;但是在MD04上还挂着它的需求 处理方法&#xff1a; HANA S4 版本&#xff0c; SE38 执行程序 ATP_VBBE_CONSISTENCY HANA之前的版本执行程序 SDRQCR21 以 ATP_VBBE_CONSISTENCY 为例&#xff0c;先选择模拟模式 执行&…

【计算机网络】 拥塞控制

文章目录 背景TCP的四种拥塞控制算法慢开始与拥塞避免&#xff1a;快重传&#xff1a;快恢复&#xff1a; 流量控制和拥塞控制本质上的 区别 背景 网络中的链路容量和交换节点中的缓存和处理机都有着工作的极限&#xff0c;当网络的需求超过他们的工作极限时&#xff0c;就出现…

Unity——对象池

对象池是一种朴素的优化思想。在遇到需要大量创建和销毁同类物体的情景时&#xff0c;可以考虑使用对象池技术优化游戏性能。 一、为什么要使用对象池 在很多类型的游戏中都会创建和销毁大量同样类型的物体。例如&#xff0c;飞行射击游戏中有大量子弹&#xff0c;某些动作游戏…

函数扩展之——内存函数

前言&#xff1a;小伙伴们又见面啦。 本篇文章&#xff0c;我们将讲解C语言中比较重要且常用的内存函数&#xff0c;并尝试模拟实现它们的功能。 让我们一起来学习叭。 目录 一.什么是内存函数 二.内存函数有哪些 1.memcpy &#xff08;1&#xff09;库函数memcpy &…

高云FPGA系列教程(9):cmd-parser串口命令解析器移植

文章目录 [toc]cmd-parser库简介cmd-parser库源码获取GW1NSR-4C移植cmd-parser实际测试cmd-parse命令解析器优化 本文是高云FPGA系列教程的第9篇文章。 上一篇文章介绍片上ARM Cortex-M3硬核处理器串口外设的使用&#xff0c;演示轮询方式和中断方式接收串口数据&#xff0c;并…

GLTF编辑器如何快速重置模型原点

1、什么是模型原点&#xff1f; 模型原点是三维建模中的概念&#xff0c;它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示&#xff1a; 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…

可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享

实战与案例分析——投资案例研究 股票量化程序化自动交易接口 一、成功的可转债投资案例 成功的可转债投资案例提供了有价值的经验教训&#xff0c;以下是一个典型的成功案例&#xff1a; 案例&#xff1a;投资者B的成功可转债投资 投资者B是一位懂得风险管理的投资者&#…

idea如何关闭项目文件显示的浏览器图标

这里写自定义目录标题 1.idea经常项目文件右上角弹出图标2.setting中Tools 取消勾选浏览器 1.idea经常项目文件右上角弹出图标 2.setting中Tools 取消勾选浏览器

Zabbix

Zabbix简介 ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 ●zabbix 由 2 部…

创造您梦寐以求的家居设计——Live Home 3D Pro for Mac

您是否曾经想象过在舒适的家中展现自己独特的风格&#xff1f;现在&#xff0c;您可以通过Live Home 3D Pro for Mac来实现您的家居设计梦想&#xff01;这款强大的3D家居设计软件将带给您无限的创作可能性。 Live Home 3D Pro for Mac是一款专业级的家居设计软件&#xff0c;…

Visual Studio 更新:远程文件管理器

Visual Studio 中的远程文件管理器可以用来访问远程机器上的文件和文件夹&#xff0c;通过 Visual Studio 自带的连接管理器&#xff0c;可以实现不离开开发环境直接访问远程系统&#xff0c;这确实十分方便。 自从此功能发布以来&#xff0c;VS 开发团队努力工作&#xff0c;…

基于STC15单片机电子时钟液晶1602串口显示-proteus仿真-源程序

一、系统方案 1、本设计采用STC15单片机作为主控器。 2、液晶1602显示电子时钟。 3、串口显示电子时钟。 4、按键控制开启暂停清零。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 uint count0; uint8 strPhoto[8]; uint wendu0;P3M0 0x…

如何选择适合爬虫的动态住宅套餐

在当今互联网时代&#xff0c;爬虫已经成为了一项非常重要的技术。爬虫技术可以帮助企业和个人获取大量的数据&#xff0c;从而进行数据分析和决策。但是&#xff0c;要想让爬虫技术发挥最大的作用&#xff0c;就需要选择一款动态住宅套餐。那么&#xff0c;在选择动态住宅套餐…