Selenium 如何实例化不同页面对象对应不同的 iframe,而不用频繁切换

自娱自乐 · 2020年12月11日 · 最后由 陈恒捷 回复于 2020年12月11日 · 1922 次阅读

一个页面对应一个 iframe: 假设业务流程为 iframe1 -> iframe2 -> iframe3 -> iframe2;
能否试下实例化对象 a,b,c 对应不同页面。 当 b(iframe2) -> c(iframe3) 后 我可以继续使用对象名称 b 来执行 b 中的方法,而不用执行 switch_to.frame(iframe2 )

共收到 7 条回复 时间 点赞

@Faerie1999 小姐姐求助

应该还是要来回切换的,但是可以把切换封装起来,比如 page object a_iframe,可以在 init 的时候便切换进来,这样不用重复写切换的代码

如果通过造构造器切换的话,实例化 iframe1 对象 a 后 再实例化 iframe2 对象 b,然后使用 a 对象的时候还是会出错,除非重新实例化 iframe1 对象。 目前只能这样吗? 有没有更好的方法?

自娱自乐 回复

我觉得页面是有前置操作的话是不能省略的,如果某个测试用例你要去 iframe1 验证或者操作的话,就只能实例化 iframe1 了。

对于楼主 3 楼提到的场景,想到一种思路,让 iframe2 对象的任意方法执行的时候,都统一先判断当前 frame 对不对,不对的话走一遍 switch_to.frame(iframe2) ,同理其他 iframe 也可以这么操作。

实际代码编写上,可以在 frame 的类里面重写 find_element 之类的基本大部分操作都会用到的方法,让它在 find 之前先切换,这样可以节省代码量。

陈恒捷 回复

因为不是开发,所以还想请教大佬一个问题:
第一种情况:如果用一个静态变量来标识是否是属于本页面 iframe,只在功能方法里面对标识变量判断;
第二种情况:如果用一个静态变量来标识是否是属于本页面 iframe,对 find_elemnt 复写来判断;
第三种情况:手动执行 switch_to.frame
3 中情况消耗的内存、代码简洁程度、和案例代码编写的流畅度综合比较,哪一种情况比较好呢? 目前个人偏好于第一种

自娱自乐 回复

hmm,消耗的内存差异应该不太大,而且对于测试代码来说不会 7x24 长时间执行,不大需要考虑内存的问题

至于代码简洁程度和案例编写流畅度,这个有点见仁见智,特别编写流畅度这个比较主观。建议你可以按这个思路分别写个 demo 对比一下?也可以听下团队其他要一起参与写自动化用例同学的意见。

自娱自乐 关闭了讨论 12月14日 15:08
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册