在使用selenium进行自动化测试时,运行时经常出现一些报错,以下为一些常见的报错,以及相应的解决办法。
一、元素找不到
Message: no such element: Unable to locate element: {"method":"xpath","selector":"//span[text()="删除"]"}
分析原因及解决方法:
1. 元素的xpath写错了,可以复制到浏览器F12中校验xpath是否正确
2. 页面未加载完成,运行该行代码时导致无法找到该元素,在改行代码前面加上几秒的睡眠,如time.sleep(3)
未切入到该元素的对应的iframe下,通过driver.switch_to.frame(id/name)切换到对应的iframe下。
二、元素不可交互
Message: element not interactable (Session info: chrome=106.0.5249.103)
分析原因及解决方法:
1. 脚本执行过程中,人为干预了浏览器的操作导致页面无法交互,可以在脚本执行时不进行人为操作电脑
2. 元素被隐藏了,例如鼠标的悬停在元素上,相应的操作才出现,可以使用ActionChains(driver).move_to_element(element).perform()方法来使鼠标悬停在元素上(注意修改方法),使元素显示然后再点击相应的操作。
三、元素无法点击
ERROR - Message: element click intercepted: Element is not clickable at point (329, 156). Other element would receive the click:
分析原因及解决方法:
1. 元素未加载完成,运行该行代码时导致无法找到该元素,在改行代码前面加上几秒的睡眠,如time.sleep(3)。
2. 元素在iframe里,导致无法点击,可以通过切入iframe后再进行点击。
3. 通过js的方法来点击元素,示例如下
element=t.dr.find_element_by_xpath('//span[text()="提交"]/parent::button')
self.dr.execute_script("arguments[0].click();", element)
四、切换iframe时,同一级下存在多个iframe且iframe的没有name和id属性
分析原因:无法通过 正常的iframe的id和name来切换到想要的iframe,这种其实是因为开发代码不规范导致
解决方法:可以通过tag为iframe来找到所有的iframe,然后根据index切换到对应的iframe,示例如下
self.dr.switch_to.default_content()
self.dr.switch_to.frame(self.dr.find_elements_by_tag_name("iframe")[3])
self.dr.switch_to.frame(self.dr.find_elements_by_tag_name("dialog_frame")[1])
五、浏览器自带弹窗处理
分析现象及原因:浏览器自带的弹窗,无法通过正常的元素定位点击确定来关闭掉
解决方法:通过切换到alert,然后接受或者取消来关闭弹窗,示例如下
alert=self.dr.switch_to_alert() time.sleep(1) alert.accept() #接受弹窗 alert.dismiss() #取消弹窗
六、日期选择框无法输入
分析原因:日期选择框无法像人工一样选择选择指定的日期
解决方法:通过移除日期输入框的readonly属性,输入对应格式的日期即可,示例如下
self.dr.execute_script('arguments[0].removeAttribute(\"readonly\")',self.dr.find_element_by_xpath('//*[@id="starttime"]'))
self.dr.find_element_by_xpath('//*[@id="page-content"]/div[1]/form/input[1]').clear()
self.dr.find_element_by_xpath('//*[@id="page-content"]/div[1]/form/input[1]').send_keys('2022-05-01')