Selenium BasePage 如何封装获取 elements 的第 x 个的点击?

醋精测试媛 · 2020年11月20日 · 最后由 Cheny 回复于 2021年01月13日 · 2255 次阅读

有看到大多数 BasePage 封装 selenium 如下:

# 定位元素方法
    def find_element(self, *selector):
        """
        传入元组
        """
        try:
            element = self.driver.find_element(*selector)
            logger.info("通过%s找的元素已被定位 " % str(selector))
            return element
        except NoSuchElementException as e:
            logger.error("找不到元素 %s" % e)

    def find_elements(self, *selector):
        try:
            elements = self.driver.find_elements(*selector)
            logger.info('通过%s找到了%d个元素' % (str(selector), len(elements)))
            return elements
        except NoSuchElementException as e:
            logger.error("找不到元素集合 %s" % e)

    # 点击元素
    def click_element(self, locator:tuple, doc=""):
        ele = self.get_element(locator, doc)
        try:
            ele.click()
        except:
            logger.exception(f"点击元素 {locator} 失败")
            self.save_screenshot(doc)
            raise

显然,这个点击元素的封装只是单个元素的点击,如果某页某元素 A 有多个,要点击第 x 个,这个情况就没有办法满足

如果是以上情况,BasePage 应该如何修改其封装呢?

共收到 15 条回复 时间 点赞

不是很理解为啥要去动 BasePage。如果是业务特殊是否应该外面再封装一层业务相关的处理,包括你说的 A 很多,要选择第 n 个,这个 n 相对来说不是很靠谱。

# 我是在 base 里面引用 base 里面的类方法的

def send_key(self,div,data):
self.find_element(div).send_keys(data)

初痕 回复

这段代码是不是不太对。。。

自娱自乐 回复

我也这么觉得,但是我觉得如果传入的元素,也有不太好的地方,可能有 staleElementsReferenceException 异常,所以我采用的办法是更新 get_element.(多传入一个参数 n:第几个元素)把这个函数变成 find_elements 然后 element[n],默认为 0,这样也不会有 noexception 异常啦

自娱自乐 回复

我们公司也只有我一个。
我觉得自动化测试不能替代所有的手动测试吧,它只是在产品迭代的时候验证一下之前的功能是否正确,甚至最好测一些基本不变的功能,减少人工的工作量。在所有的 bug 中,自动化测试只能测出最多五分之一,但是它的存在,可以在产品每次增加新功能时,手工测试的小伙伴更多的关注新功能时,保证老的功能没问题。
另外,测试需求很重要,你需要测什么,如果有产品需要测,就做自动化,如果有协同测试或者别的需求,也可以写一些测试工具或者平台,这个时候可以去多学一些前后端的知识。
我也不是很懂,也是在实践中成长,如有说得不对的,请谅解。

我想问下你们自动化是怎么实际应用的,因为救我一个测试,开发也不知道怎么用~

自娱自乐 回复

我已经知道了,谢谢,不过我觉得还是原生函数放到基础页面层比较好。

显然,这个点击元素的封装只是单个元素的点击,如果某页某元素 A 有多个,要点击第 x 个,这个情况就没有办法满足---->传入 elemnt(你要进行点击的元素),进行点击就行。没必要找到元素再去点击。就没有你说的问题了

实际真正的 dalao 都去写测试平台去了~ 我把 click 写在子页面,然后子页面所有元素的操作再封装成为一个操作逻辑。test.py 再直接调用测试这个操作逻辑的方法,并添加断言、截图。 最后 run.py 批量执行

初痕 回复

二次封装 selenium 的方法,做到页面与业务分离。

你要实现的功能是什么,是封装一些方法还是做页面与业务分层

初痕 回复

传入 element,是直接传入 find_element 的结果,这样做后期维护会有问题吗

封装参数使用 location,如 id,classname,xpath 这种,易于后期维护

初痕 回复

您好,请问您觉得,像 click ,get_attribute 封装等等,是传入 location 比较合适,还是传入 element 比较合适呢

java
/**
* 根据 id 定位元素集合,通过 index 定位元素并点击
*

* @param id,index
*/

public void clickByListIdAndIndex(String id,int index) {

List webelements=driver.findElements(By.id(id));
for (WebElement webElement : webelements) {
webElement=webelements.get(index);
webElement.click();
}
}

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