Selenium 最近用 selenium 写 ui 自动化

tester · 2022年08月29日 · 最后由 lazyBoy 回复于 2022年11月09日 · 11393 次阅读

说实话,被定位弄麻了。
xpath 的各种方法都试过了,contain,兄弟,父子啥关系都试过了,都定位不到
这些元素的类名都是相同的,出了 text 不一样,没有任何区别,问题是 text 也定位不到
快放弃 selenium 了,最后还是用的图片识别定位。
出了 selenium 有没有好用一点的

共收到 25 条回复 时间 点赞

看看网页中是否有 iframe 元素

Ranorex Studio

在 Ranorex Studio 面前,Selenium 就是个弟弟

谁说 text 定位不到的,

XPATH 都定位不到,有没有可能是你理解的定位出现了偏差

贴个 html 看看呀,这么难

playwright 可以 text 定位😀

我也有类似的困扰,有些元素完全无法定位。
但是用 seleniumIDE 去录制回放,可以正常回放定位该元素。
但是专门将 seleniumIDE 代码导出后,却又无法定位了

用 selenium 的话,应该是 web 自动化吧,selenium 是最优解,所有网页基本都是可以定位和操作的,如果做不到,说明自己理解还不够深。没事可以多看看 xpath 和 selenium 官方文档。

另外前端组件化之后,大多组件确实只能靠 text 定位,所以我现在大多都是用 text 定位,还可以使用层级关系,先找到一个元素,然后通过元素找下级元素,和轴定位还不太一样。

这里贴一个我写的 xpath:

class Button(ClickMixin):

    def __init__(self, text: str):
        # 把当前节点的文本去除前后空格后,替换中间空格,然后比较文本
        # template = ".//{0}[translate(normalize-space(),' ','')='{1}']"
        # 暂时只开放button和a标签,避免匹配太多标签导致混乱
        a = f".//a[translate(normalize-space(),' ','')='{text}']"
        button = f".//button[translate(normalize-space(),' ','')='{text}']"
        # 支持带cursor css类的span标签
        span = f".//span[translate(normalize-space(),' ','')='{text}']"
        # vue表格操作栏的按钮
        table_btn = f".//div[.='{text}' and @class='table-handleBtn']"
        xpath = f"{a}|{button}|{span}|{table_btn}"
        super().__init__(xpath=xpath)

使用层级定位和一些 xpath 的写法,如果楼主能看明白的话,应该是可以解决定位不了的问题。

def _get_options(self, layer: int) -> list[WebElement]:
    # 普通下拉
    xpath = f"//div[contains(@class,'el-popper') and not(contains(@style,'none'))]/descendant::ul[{layer + 1}]"
    # 添加组合商品等待下拉的按钮,会使用下面的样式
    xpath += "|//ul[contains(@class,'el-popper') and not(contains(@style,'none'))]"
    element = self._driver.find_element(By.XPATH, xpath)
    return element.find_elements(By.XPATH, ".//li")
frankxii 回复

确实 现在的前端框架只能用文本信息辅助定位,根容器能够有个唯一的的 ID 就不错了 ,你的设计方式和我的差不多 ,我这是这么写的

.//form[contains(@id,'#placeholder#')]//label[normalize-space(@title)='#placeholder#']//following-sibling::div//input[@type='text' and @name]

楼主,除非是不在 DOM 树里的元素 不存在有 Xpath 定位不到的

而且 Xpath 非常灵活 可以定义一个 pattern 来匹配多个类似的元素 就像是楼上的这种设计

干饭狂人 回复

可以开个帖子,介绍下这个工具,以及它在控件定位上比 selenium 先进的地方么?想了解学习下。

建议楼主贴下具体的 html 和 xpath ?原理上只要是 html dom 树存在的东西,xpath 就可以定位到。

不过有一点个人是同意的,那就是现在前端组件化后,selenium 这种基本上基于原生 js + html 来写脚本的工具,用起来会越来越不方便。

由于组件基本不再需要 id 这类唯一标识来给 js 调用,对于开发人员来说也基本看不到被组件封装后的原始 dom 树信息,所以基于 html 去做控件定位变得越来越麻烦。同时由于逻辑上也基本向着双向绑定的方向走,所以有时候想改变控件的值,还不能就直接去输入框里 setValue(有可能背后是监听 onChange 事件来做数据同步,而非直接读取 value 属性)。

陈恒捷 回复

看了下官网介绍,这个工具在 web 测试方面底层驱动应该也是 selenium,定位的话好像自己整合了一个 RanoreXPath 来适配多端。除此之外有整合组件化的概念,这也是我第一次专门看到一个工具在 UI 方面做组件化,和我做组件化的思路是完全一样的。然后有自己定义 action 来整合一些常用的方法,最后做了录制。虽说录制是快速做到 60,70 分,但底层做的工作还是让这个工具拥有定制化然后达到 80,90 分的能力。

仔细看了下这个工具支持的概念和功能,还是不错的,我一个测开做的话可能至少要差不多半年时间才能做出类似的东西还不一定更好用。如果是到一个新团队然后要推 UI 自动化,我可能会更多调研之后尝试推这个工具。

frankxii 回复

学习了。

后面如果有更多的调研,可以发帖分享下。感觉现在前端的 UI 自动化工具,有点跟不上现在开发领域的组件化开发大趋势,虽然功能上还是可用(毕竟底层还是 html+js),但效率上落后不少。

frankxii 回复

话说,想问下它这里的组件化,和 UI 自动化常见的 Page Object 模式,差别大么?

PageObject 模式里,把 page 从页面级别改为组件级别,理论上也可以做到和开发的组件一一对应。每个 page 自带有属性(控件对象)和操作方法(自定义 action )。

陈恒捷 回复

常见的 PO 并没有变,组件化只是把元素定位和操作这块单独提出来做了抽象封装,以此提高组件的复用性,易用性,然后在 PO 里面就不再直接操作标签,而是通过组件进行交互。

我之前在飞哥的帖子下面也有做新的回复,写了一些我做的案例,可以看一下。UI 自动化的分层设计,然后 renorex 的组件化思路是对的,从人的角度来讲,我们看到的确实是一个个组件,从开发角度讲,现在前端和客户端也都是组件式开发,selenium 早期的 locator 已经不适用了,组件化定位和操作以后肯定会像 PO 一样成为 UI 自动化规范。

by the way,我已经转游戏客户端开发了,以后在测试方向的研究会少很多,现在也还只是出于兴趣在了解和探讨,不过技术和开发思想都是相通的,以后有想到什么好的方法和方案有利于测试的,到时候也会到 testerhome 来聊聊。

十有八九是要切换下 frame...

19楼 已删除

我最近搞的就是 css 样式差不多,只有 span 文本不一样,xpath 还是可以定位啊

frankxii 回复

组件化这个方向深感赞同,学习了。未来 UI 自动化大抵都得往这个方向靠。

最近出了个 katalon studio 有人研究过没,貌似也很简单化

使用 xpath 轴试试呢

没人怀疑过可能是 Shadow 的问题吗? 排除 iframe 之后, 还定位不到的话, 大几率就是 Shadow 的问题了

我去催饭 回复

出了很多年了.....

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册