Selenium Web UI 不规范元素 定位

木月 · 2021年05月25日 · 最后由 Rrrrookie-tester 回复于 2021年06月02日 · 3567 次阅读

🔔 万能 xpath?

现状,Web 端开发,对于一些属性,没有什么强制或规范要求,基本上,开发一个页面,除非开发自己用到,基本不会设置方便后续测试展开自动化用到的 id 等属性(ps:我用不到就不写,就是玩~)
那在开展自动化时,怎么去定位这些?

第一种

xpath,感觉真的很强大,之前了解片面了,新人可以重点学习下这个规则

第二种

如果想要组合形式的定位方法来实现定位,例如 Uiautomator 中的定位方式

Mydevice().findObject(new UiSelector().resourceId().text())

用到 id 和 text 2 个属性来准确定位元素,如果还是不精准,可以继续加定位唯独

selenium 目前来看,没有提供这种方法,如何实现它?

查看一个元素提供的方法,有 2 种操作:
1、继续通过 find_element() 的方法继续查找,这种方法目前还没有测试验证过,暂时略过,有了解的小伙伴也可以科普下。
2、通过获取一些元素的属性值,来继续做定位

def find_element_by_attribute(self, type, value, attribute_name, attribute_value):
    eles = self.driver.find_elements(type, value)
    if len(eles) == 0:
        SetResult.set_fail('未匹配到元素,type:{},value:{}'.format(type, value))
    for item in eles:
        if item.get_attribute(attribute_name) == attribute_value:
            return item

    SetResult.set_fail(
        '未匹配到元素,type:{},value:{},attribute_name:{},attribute_value:{}'.format(type, value, attribute_name,
                                                                              attribute_value))

因为代码没有过多考虑测试方面的原因,首先最可能的就是通过 class 获取元素列表,然后根据现有的属性来做进一步判断,如下图

find_element_by_attribute(By.CLASS_NAME, "ant-input", 'placeholder', '请选择开票日')

XPATH 轴定位,新学到的


那么上面的定位则可以写成

driver.find_element(By.XPATH,"//span[@id='custom-validation_invoiceDate']/descendant::input")

感谢!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 8 条回复 时间 点赞

xpath 的轴定位可以解决此类问题

MarvinWu 回复

刚看了下规则,好像是可以,多谢,我仔细了解下

xpath 确实很强大,我们现在都统一了用 xpath,其他 7 种定位方式基本都可以用 xpath 代替。

xpath 和 CSS 都可以解决此类定位问题,官方推荐 CSS,语法都很灵活强大,但 CSS 性能更高
开发不加 id,就会增加测试脚本的维护成本,反正我司前端开发规范中就有加 id 这条

Tester_谜城 回复

这个很赞

find_element_by_attribute 这个不是 css 里面的语法?为啥不直接用 css 选择器?

很多年前,是靠植入 sizzlerjs,然后用万能的 css 定位

自己是菜鸡 感觉 Xpath 维护成本高,用的多的是 css selector

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