测试人社区

selenium 深度不够,还存在一些问题没有解决

感觉selenium还有一些问题没有解决:

  1. 用例的组织形式,有那么多链接,不能只给一个初始化的链接呀?

  2. 对于定位讲的太粗浅,变化的定位 和 一些下拉框等基础的都没有涉及到

  3. 老师最后自己组装的显示等待中 ,参数x是干啥用的 也没有说明

  4. 断言也没有讲

  5. 也没有实现数据和框架分离

  6. 也没有解释,为啥在base_page中创建了 find finds 这个的区别是啥,为啥要这样做?

我只解答一些技术性问题哈,其他的我我也不是很清楚

现在的用的PageObject模式就是一种框架分层模式,那么用例层写在testcase层就可以了,那么用例的组织形式不清楚你的具体是啥?理论上setUp/tearDown模式解决了用例的前后关联,就是一个用例就可以成功运行了

变化的定位的解决方案都是显示等待+基础定位来解决的,只要你把显示定位掌握好了就可以解决这种“变化的定位”,下拉框这些定位应该录播课有讲或者自己去补一下就可以,就是很简单的内容

参数x是一个java 8的lambda表达式,x代表了一个形参

断言这部分应该再基础课里面就讲过了,selenium实战课应该就是直接用了,注意看下老师的源代码

数据和框架的分离指的是什么数据?你的输入数据?还是定位数据?

find finds 这两个方法其实差不多是一个类型的,猜测一个应该是找所有元素,一个是找一个元素吧,因为没有源代码,只能靠猜

第六点我知道,find_element和find_elements可以追踪源码,看返回值,前者只返回value,直到超时;后者返回value或者[],就是none
所以在判断显示等待条件代码那里用find_elements找姓名元素,没找到就返回[],无限点击添加成员,找到就返回value,就能执行else退出循环

1 Like
  1. 第一点你回复的我不同意,那是不是说,只要首页挂了,那后续的都不能进行,所有的都依赖第一个页面的状态????
  2. 第二点,说的很空洞,不知道如何实践????
  3. 第三点 形参的作用是干啥,为啥加上就可以不加不就行?
  4. 第四点 断言确实没有讲到,一个体系化的内容,在将框架的时候,断言如何整理,案例如何整理都没有讲,那就不具备实战的条件!
  5. 数据 和 框架分离,是指: 我操作输入的数据,直接写到PAGE 页面,这样用例就只能进行一种测试,这不是一个框架该有的姿态
  6. 。。。
  • 1.每个PO都可以写base_url的,不过建议不能直接打开的页面还是不要写了,不然如果谁写错了直接从这个页面作为入口进入,脚本直接就会报错也不太好。
  • 2.定位主要就是CSS selector 和 Xpath两种了,变化的定位是说的什么情况?是需要前置触发或者操作才能出现的元素吗还是?其实在高级定位的录播里已经讲的挺清楚了,主要就是利用元素中不变的属性,或者是元素之间的层级关系配合不变的属性去定位,下拉框也就是在定位前多加了一步点击的操作,定位本身和别的元素没有什么区别
  • 3.老师上课的时候有讲参数x是因为去调用这个函数的方法会传入一个参数,如果不设置参数来获取这个传入的参数的话,调用就会报错。但是获取之后实际逻辑中并不需要,所以就空闲没使用。
  • 4.断言的话在录播和之前的pytest课程中已经讲过了,selenium中并没有什么区别,依旧是那些断言,只是获取数据的手段和方法变了
  • 5.数据和框架的分离是什么数据和框架的分类?如果说是测试数据的话,测试用例的数据和测试用例分离在之前的pytest课程中已经讲过了,selenium这边的测试用例是一样的,重复讲一遍意义不大。
  • 6.在base_page里创建了find finds方法,有几个用处
    • 最浅显的效果就是,因为find_element和find_elements方法使用的频率特别高,这样做可以简化代码量,不用每次都写self._driver.find_element这么长,而是使用self.find即可。
    • 另外,将其封装为一个方法之后,可以进行一些统一的处理操作,比如增加一个等待时间,做一些异常情况的处理,添加一些问题的捕获,添加日志的记录等等操作。

有点不懂的是,为啥改了一下s就可以实现返回值类型不一样的问题:

#find只返回value,直到超时;
def find(self,by,locator):
return self._driver.find_element(by,locator)
#finds返回value或者[],就是none
def finds(self,by,locator):
return self._driver.find_elements(by,locator)

  1. 不知道这个为啥调用的时候也没有传参啊,在定义中也没有使用到这个参数,为啥就必须写呢??

  2. 但是断言需要整理的吧,需要存储的吧? 这些是怎么做的呢?

  3. 之前讲数据分离都很槽,随便建了一个文件,随便写了一些样式数据就完了,以为会在实际应用中重点使用,但是并没有

  4. 我没有问封装的好处,我想知道的是 find 和 finds 的区别??以及这样做的作用是啥,,为啥要两个

你可以追踪find_element和find_elements的源码进行查看

问题3


因为封装的等待方法中最终调用该方法的是until方法,until方法调用的时候会传入一个参数(如图所示)所以需要被调用的方法有一个参数来接收这个传入值,不然就会报错

4.断言是属于测试用例部分的,基本写法就在之前pytest的课程,这部分内容不太建议封装,因为测试用例步骤做成数据驱动除非用来做测试平台,不然的话编写和维护难度其实是会变大的。
5.yaml文件的格式就是这样的,基本格式了解了之后,需要什么格式,按照规则去写就是了,怎么写主要取决于你测试数据是什么形式的。
6.find和finds对应的方法不是一个,功能也是不一样的,这个你直接追踪进去看封装的方法就知道了。

find是返回一个元素

finds是返回多个元素的列表,如果只找到一个就是一个元素的列表,需要加下标才能读取出来

首先声明,我不是python班的学员,可能有些上下文我无法联想,只能根据你贴的代码来回答!

第六个问题:加s返回的是个列表,也就是一组元素对象,如果找不到那就是空列表
不加s返回的是一个元素,如果找不到就是会抛异常