今天SZ有雨,整个上午看着外面都是云很多,很大,所以我又变成‘死机’状态。最近是真的服了,好像觉比以前多很多,一直睡不醒。下午可算是清醒点。不过跑app脚本也真的奇怪了,同一份脚本换2个手机就死活执行不了,我真的要疯。
个人博客:https://blog.csdn.net/zyooooxie
一)元素定位 find_elements()
在写用例的时候,定位最常用的是driver.find_element_by_id()、driver.find_element_by_xpath()、self.driver.find_element_by_id()、self.driver.find_elements_by_css_selector()、self.driver.find_element_by_class_name();
但有时候 遇到相同id或者相同classname的情况,咋办呢?
元素定位本就是想用唯一属性来定位的,遇到这样的情况我一般是 先看有没有其他唯一属性(例如 text属性不同,使用driver.find_element_by_android_uiautomator(‘text(“xxxx”)’)就可以搞定)
接触一段时间的find_element(),联想到会不会有find_elements()。
没错,推荐的是driver.find_elements()
elements方法是复数,定位到的是一组元素list,返回的是列表;其实质可以理解为 先把相同属性的元素找出来,取对应的第几个就可以了。
这儿是封装的一个方法:传入参数包括–定位的方式、元素定位的属性值、所在位置
def new_find_elements(self, by, locator, num):
if by in [By.CLASS_NAME, By.ID, By.XPATH]:
WebDriverWait(self.driver, 10, 0.3).until(EC.visibility_of_element_located((by, locator)))
return self.driver.find_elements(by, locator)[num]
else:
print('定位方式不推荐')
raise NameError("cuo")
解释下:所在位置num,因为这个是list,所以要从0开始;
有一个很容易混的是 app某些元素的属性是同样的class xpath定位标签是【1】【2】
举例:
fu_caini_xpath = '//*[@resource-id="like_more"]/android.widget.RelativeLayout/android.widget.TextView[1]'
fu_gengduo_xpath = '//*[@resource-id="like_more"]/android.widget.RelativeLayout/android.widget.TextView[2]'
实际class name 和id 很多相同情况,是可以用find_elements();
但是为什么定位方式加上xpath,就用上面的 举例,可修改为:
fu_zi_xpath = ‘//*[@resource-id=“like_more”]/android.widget.RelativeLayout/android.widget.TextView’
caini_num = 0 和 gengduo_num = 1
下面是一个用例
def test_03_d482d(self):
self.wodehuodong()
self.xin_find_element(By.ID, self.wode_jinruqunliao_id).click()
self.xin_find_elements(By.ID, self.wode_jinruqunliao_shezhi_id, 1).click()
self.xin_find_element(By.ID, self.wode_jinruqunliao_shezhi_xuanze_id).click()
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie