Selenium元素定位太难搞?这些坑我替你踩过了!

1.非select类下拉框

在非select类下拉框这里遇到了两种需求,一种是可输入字符,一种是不可输入字符

  • 输入部分字符按照智能提示点选

这种下拉框允许输入字符,沟通后确定输入字符如出现多个选项则点选第一个

思路:用send_keys输入字符后会激活下拉框进行智能提示,然后用ActionChains模拟鼠标点击

图片

 

brand =  driver.find_element_by_css_selector('#rc_select_0')

brand.send_keys(lst[1])

time.sleep(0.5)

ActionChains(driver).move_to_element(brand).move_by_offset(0,30).click().perform()

#ActionChains(driver).move_to_element(brand).move_by_offset(0,30).context_click().perform()

#这里用鼠标先定位到输入框,再往下移一段距离,这里因为不知道移动的距离,所以先用点击左键context_click来观察

  • 不可输入字符

需求:按照指定的内容选择相应的选项

思路:点击一下激活下拉框,因为无法用Select模块,所以要先获取全部的选项,然后遍历匹配目标内容,匹配上了则点击相应的元素

图片

从图片中可以看到这个下拉框是一个变动的,周围没有其他的选项,activedecendant属性会跟随鼠标的选择变化,观察看到aria-owns来自另一个地方,定位后如下图:

图片

可以看到定位后出现的也是一个变化的元素,而在它不远处就是所有的选项,是一对div标签,于是用find_elements获取所有的选项进行匹配,然后再点击该元素即可

 

driver.find_element_by_xpath("//input[starts-with(@id,'ifDangerous_productList_0')]/../..").click()

#点击下拉框激活,如果不激活的话选项元素会被隐藏无法定位

lst_dangerous = driver.find_elements_by_xpath("//div[starts-with(@id,'ifDangerous_productList_0')]/../div[2]/div[1]/div[1]/div[1]/div") 

#获取选项,形成一个列表

fordangerousin lst_dangerous: 

iflst[12]==dangerous.get_attribute('title'):#遍历匹配

        driver.execute_script('arguments[0].click()',dangerous)

这里要提到一个尚未解决的地方,另一个下拉框与此类似,但因为下拉选项很多,超过了10个,于是在本应展现全部选项的地方仍然展示不全,也是一个变化的状态

图片

图片

找了半天也没有找到能获取全部选项的地方,好在这个下拉框允许输入,通过输入再模拟鼠标点击解决了,不知道有没有更好的办法

2.定位动态id和无唯一属性元素

  • 定位动态id

在这个网页中很多元素都是动态id,因此无法直接用id定位

图片

如上图,后一半是动态生成的,但前一半是固定的,可以通过xpath表达式进行定位

 

driver.find_element_by_xpath("//div[@id='xxx']/A")

#由id为xxx的父元素定位到子元素A

driver.find_element_by_xpath("//div[@id='xxx']/..")

#由id为xxx的子元素定位到其父元素

driver.find_element_by_xpath("//div[@id='xxx']/../A")

#由id为xxx的子元素定位到其同级元素A(先定位到父元素)

  • 定位无唯一属性元素

本身无唯一属性,也可以通过xpath、css_selector的绝对位置来定位,可是网站上有很多隐藏的元素,在特定的时候会出现,所以会导致绝对位置变化,如果要实现每次定位都能成功,应该尽可能使用相对位置。

思路:先定位到周围有唯一属性的元素,再通过该元素定位到目标元素

图片

 

lst_dangerous = driver.find_elements_by_xpath("//div[starts-with(@id,'ifDangerous_productList_0')]/../div[2]/div[1]/div[1]/div[1]/div") 

如前面所说的下拉框,就是通过id=ifDangerous_productList_0_…这个元素,定位到父元素,在逐步定位到目标元素

3.通过JS解决点击被遮挡的问题

有时实行点击时,会被遮挡或不在范围内,可以采用执行JS

 

ele=driver.find_element_by_xpath("//input[starts-with(@id,'chemicaltype_productList_0')]/../..").

driver.execute_script('arguments[0].click()',ele)

4.非input上传文件

input上传文件只要用send_keys输入路径即可,非input会触发windows控件,但是selenium无法操控windows,于是要使用pywinauto库

#点击上传按钮,触发窗口

upload1 = driver.find_element_by_xpath("//div[text()='MSDS文件:']//../div[2]/span[1]/div[1]/span[1]/button[1]")

driver.execute_script('arguments[0].click()',upload1)

#通过窗口打开

app = pywinauto.Desktop()

#通过弹窗名称进入控件

win = app['文件上传']

#输入路径

win['Edit'].type_keys(path + '\\' + file)

#点击打开按钮

win['Button'].click()

需要提醒的两点是:

通过弹窗名称进入控件时要注意不同浏览器的名称不一样,如火狐浏览器是“上传文件”,谷歌浏览器是“打开”

不能使用360安全卫士,否则会报错

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值