Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」

  • 2020 年 8 月 23 日
  • 筆記

1.web 基础-html、dom 对象、js 基本语法

Dom 对象里面涉及元素定位以及对元素的修改。因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用。得要掌握前端的基本用法。为什么要元素定位?因为找到这个元素,就能告诉代码要找谁要做什么。

2.元素定位

四大基本元素定位:id name class_name tag_name

针对链接:link_text

部分文本内容:partial_link_text

万能定位方式:xpath css

常用的元素定位方式是:id xpath

css 选择器的定位方式看起来比较复杂,和前端挂钩,但是 css 能做的事,xpath 一样能做。只要能解决问题就行。

动态 id,可以用别的属性来定位。xpath 基本的定位原则是:相对路径,相对路径中基本的定位方式是//标签名[@属性名=值]

但是这种基本定位方式对我们来说不够用,所以增加了逻辑运算://标签名[@属性名=值 and/[email protected]属性名=值 ]

以上是靠自身的属性来定位,还可以靠文本内容来定位:通过文本匹配的方式,「目前 css 是不支持文本定位方式的。」 但是 xpath 可以定位:文本全匹配://标签名[text()=文本值]

文本和属性的部分匹配://标签名[contains(text()/@属性值,部分值)]

以上 3 种是根据自己的特质来匹配的。

如果靠自己的特质不行的话,可以通过:

1.层级定位:先定位到上级或者上上级,缩小范围,再定位元素。

2.轴定位:找各种关系来定位。这种一般在表格当中比较多。轴定位的方式有这几种:

ancestor:祖先

parent:父母(这里主要指爸爸)

兄弟姐妹:

preceding-sibling:选取当前节点之前的所有同级节点,同一个parent下该节点之前的节点,即“哥哥”节点(是同父的哥哥节点)。

following-sibling:选取当前节点之后的所有同级节点。

在各种定位解决不了问题的情况下就可以用轴定位了。各种定位方式随便组合,就能够定位到你要的东西。

「定位原则:」

定位也非常影响脚本的稳定性,如果定位做的不好,这个影响也是比较大的。

1.尽量不要使用绝对路径和下标。

2.通过定位方式唯一匹配元素,匹配一个元素,而且确保这个元素就是你要找的。

3.选择元素稳定的属性。(这样不至于元素一变动或者页面的内容一变动,这个元素对应的东西也变了。可变的属性不要作为元素定位手段)这个需要自己观察了。

3.元素操作

「页面最基本的 4 大操作(函数):」

send_keys:输入

click:点击

text:获取文本值

get_attribute:获取属性

在 APP 的 web 自动化中直接套用这 4 大操作。

针对特殊的元素做的一些处理:

「三种等待方式:」

sleep:强制等待

implicity_wait:隐形等待

WebdriverWait和expected_condition:显示等待

在实际工作过程当中,sleep会和WebdriverWait和expected_condition结合起来用。

sleep仅仅作为辅助作用,WebdriverWait和条件组合起来能够找到元素,但是在运行的时候会告诉我,这个元素还没有出现,这种情况下不用觉得它没有用。「再借助sleep0.5 秒或者 1 秒都可以。」 给页面一个缓冲的时间,虽然它可能找到了,但是可能页面渲染还没有成功。

sleep不应该睡眠太久,这样很浪费时间。WebdriverWait这个显性等待是我们用的最多的。WebdriverWait是一个类,它处理的是我们的等待。它有一个等待上限。

「显性等待的用法:」

WebdriverWait(driver,timeout,0.5 ).until/until_not 会话对象 超时时长(最多能等多久,隔多久看一眼) 默认是 0.5,可以改成别的数字

WebdriverWait有 2 个函数until/until_not,一个是直到条件满足,一个是直到条件不满足。

「怎么表达条件?」

条件就用expected_condition 期望的条件。可以用它来作为条件表达,条件表达最常用的就是元素可见。关于它的传参,是一个元组等等。visibility_of_element_located((元素定位类型,元素定位表达式))

还有元素存在,元素可点击等等。

「三种切换:」

三种切换都用到了等待。

iframe切换、window切换、alert弹框都有一个显性等待。

iframe切换是一定要有iframe才需要切换。一定要确保你的元素确实是在iframe里面。至于如何确认的,请回看文章《三种切换》。

iframe本质上也是一个元素,只不过它的标签名叫做iframe。但是它里面放的是个 web 页面。

APP 自动化中就有这样的情况,外面是一个安卓的控件元素,但是控件里面放的是 web 网页。这里也是一样的意思。iframe是外面的主页的一个元素控件。跟它里面放的是一个 html 页面含义是一样的。

在 App 自动化中 h5 的混合应用,也就是 web 网页和安卓原生控件混在一个页面中的时候,也要涉及切换,道理和iframe一样的。结合了iframewindows

「iframe切换可以根据哪些属性?」

name 下标 表达式 WebElement对象

以上这些都可以切换进去的。切换是这样做的:在我们 selenium Webdriver 当中切换是统一的driver.switch_to.frame/window/alert

APP 自动化中也是driver.switch_to。这个东西是通用的,只是后面跟的名字不一样。

「windows 的处理流程是:」

要获取当前所有的window_handle(driver.window_handle)得到的是一个列表。最后一个是最新打开的窗口。是根据它的句柄,也就是根据列表当中的位置去切换的。自己要清楚它在哪个位置。

alert弹框」

只有处理了alert才能对页面进行操作。一个浏览器当前直接只能有一个alert。它是一个alert类来处理的。alert当中有accetp\dissmis来表示接收和拒绝。

「鼠标/键盘操作」

鼠标:ActionChains类:这个类里面分为 2 种操作类型:

将所有的操作双击、点击、拖拽、右键这样的东西都是放在一个列表当中。

1.鼠标行为函数(move_to_element、悬浮元素的定位)。

2.perform()函数是用来执行鼠标操作的。

能不用鼠标就不用鼠标,如果有其它的按键操作就代替鼠标操作,因为鼠标操作不稳定。

APP 自动化中有一个东西的套路和ActionChains的套路是一样的。Web 自动化的基本东西和框架掌握了,那么 APP 自动化就没有什么难度。

「键盘操作」:send_keys(Keys)

send_keys(Keys类)本来就是用来发送数据的。1,2,3…等这样的简单数字就用send_keys()发就可以。

没必要用到 Keys 类。当你用到组合键的时候,就可以用 Keys 类。其它情况下,没事不用它。

「下拉列表:」

Select\optionSelect类来处理。

Select类来处理,有哪 3 种选择的方式?实例化的时候传什么样的对象?

实例化类的时候,初始化参数是Select元素。

「列表选值的 3 种方式:」

index/value/visible_text

valuevalue属性。index是它在这个列表中所处的位置,从 0 开始。visible_text是指它的文本内容。

有哪个用哪个,如果value/visible_text没有,那么index是肯定可以用的。根据实际情况而定。

以上这些是特别的处理,其它的下拉列表,例如通过 div 实现的,等到下拉列表出现再去处理。像这种是不需要等到下拉列表出现的,直接省了这个步骤,也不需要你去点一下让它出现。

「js-滚动条:」

APP 其实也有滚动条的,但是做法有点点区别。滚动条是执行 js 语句。driver.execute_script(js语句,参数)

这个参数可以传很多个。这个参数是给 js 语句用的。

Arguments[0]scrollintoView()

传参 滚动到可见区域

默认是 True,与上边对齐。改成 False,是与下边对齐。

Arguments[0] 0 来自于这个driver.execute_script(js语句,参数)执行语句中的参数,是第一个参数。如果是第二个,就是Arguments[1]

「由参数的个数决定Arguments里面的下标值到底是几。」

至于滚动到页面底部和滚动到页面顶部,用scrollintoView()

另外一个 js 中的语法也可以做这个事情:scrollintoViewifneeded()

并不是一定要处理滚动条,看系统。如果框架实现了截图,截图里也看不到,元素是可见的但是提示你不可见,那就需要你将它滚动到可见区域。很多情况下是不需要将它滚动到可见区域的。

「js-日期:」

如果不好做这块的自动化就不要做了,就手点了。

日期输入框readonly属性。

也有可以编辑的时候,如果可以编辑就按照系统规定的格式输入。如果是不可以输入的,移除readonly属性,或者将它设置为 False。

「文件上传:」

autoit需要学习成本。在 mac 或者 linux 下面,用autoit

pywin32:专门针对 windows 做的文件上传。这块的代码在《利用 pywin32 库上传文件》一文里,你们直接拷贝就可以,不需要自己再写一遍了,明白你需要改的地方是什么就可以了,有需要的自取。

4.Selenium 运行原理

以命令的形式定义好了内部 http 通信协议。所有的命令都定义好了,所有的函数基本操作都是通过发送命令来实现的。详情请回看《元素定位和元素定位辅助工具》一文。

对原理有进一步的认知是比较好的。要成为一个会研究的人而不是只会用的人,所以多看源码。

5.项目实战+框架

1.业务了解,需求了解。(如果公司让你写一份自动化测试计划,这个就是整个自动化测试计划的一部分。前期就是要花时间了解业务的。)详细的请回看《做自动化之前的准备工作》一文。

2.测试用例的实现、筛选(多和团队人员交流,了解全方位的信息)、用例评审。

3.框架、大概用多少时间实现自动化测试用例、持续集成jenkins、优化和调试、提高用例通过率(通过率至少80%)、哪些是冒烟用例(什么时候/运行时长)、SIT/预生产、邮件通知。

4.维护阶段(分析测试报告--哪些是bug、哪些是你代码的bug、哪些是环境问题)

5.汇报。

在前期就应该明白哪些是冒烟用例,实现用例可能两个月,后期的调试需要半个月,调试是需要时间的,也不简单。什么时候冒烟,什么时候回归,每周运行多少次,周末要不要运行等这些运行策略,在最开始做的时候自己就要非常清楚的。

「框架:」

PO 模式:PageObjects(页面操作、元素定位)、TestCase(业务流程)、测试用例和测试对象分离。

进一步分层:PageLocators(页面元素定位)、TestDatas(测试数据的分离)

Common:basepage:封装基本函数、异常处理、失败截图、日志。

Outputs:Logs、Screenshots、Reports

pytest框架:mark、参数化、fixture/conftest.py、重运行(reruns)、html测试报告、allure测试报告、xml测试报告(定制化)

pytest 的 html 测试报告当中是可以插入自动化截图的,既然用了 Allure 就不需要这个功能了。

6.问题整理

Jenkins 中可以关联工程的执行顺序的。可以设置当前工程执行成功之后再去执行下一个工程。

「pytest 里面有个 skip 是什么?」

unittest 也有 skip。是指这个用例不想执行的话就跳过去。

「执行机和本机不能是同一台电脑。」

ps:假如领导让处理你不熟悉的领域的事,不要犹豫,赶紧去做。有什么不懂得可以多和上司沟通,自己不需要做决策,可以提供方案让领导来选择。遇事不退缩,勇敢面对。


公众号 「「清菡软件测试」首发,更多原创文章:清菡软件测试 78+原创文章,欢迎关注、交流,禁止第三方擅自转载。