自动化踩坑记之——怎么元素又定位不到了?
刚入门自动化的时候,觉得会很简单。不就是find_element,click吗,非常潇洒的敲了几行代码,一执行:
理想很丰满,现实很骨感。为什么呢?元素怎么定位不到呢?
先检查xpath 是否正确,若网页端定位到,则用以下方法逐个排查
1.元素是否加载出-
初级-定位元素前加延时:time.sleep()-不推荐使用,死等待过多,影响执行效率
time.sleep(3)
el_p=driver.find_element_by_xpath('//*[@class="result c-container "]')
高级-WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait as WD
element = WD(driver, 3).until(lambda x: x.find_element_by_xpath('//*[@class="result c-container "]'))
2.是否需切换上下文-switch_to.context()--适用于手机端HybirdApp or 微信公众号等...
以微信公众号为例,contexts由Native及webview的context组成。当页面为webview时,则需切换至webview。反之亦然。
tag = 'tencent'
contexts = self.driver.contexts
for context in contexts:
if tag in context:
self.driver.switch_to.context(context)
如何判断改切至哪个webview呢?
在网页端查看当前手机端界面时,即会显示所在的webview。如若此处不显示,则为Native页面。
3.是否需切换句柄-switch_to.window()--适用于网页端浏览器
当点击A网页中的某一项,导致新打开网页B,此时要操作B网页的内容时,则需切换句柄。
for i in driver.window_handles:
if i != driver.current_window_handle:
driver.switch_to.window(i)
4.是否需要切iframe- driver.switch_to.frame() --适用于网页端浏览器
网页端的页面会有iframe嵌套的情况,操作iframe中的元素时,需要先切换至此iframe
driver.switch_to.frame("login_frame")
qq_user = driver.find_element_by_id("u")
加上此句成功后,刚开心2s,发现操作主页面时,又会报错。什么原因呢?
切换至iframe后,需要释放iframe,重新回到主页面上,才可操作。
driver.switch_to.default_content()
driver.find_element_by_id('su').click()
那么如何判断元素是否在iframe上呢?
4.1.定位时带iframe标签
4.2.如若定位时没有iframe标签,则如图位置再次确认
总结很重要,不错
如果是微信公众号的话 还有可能没有打开微信的调试模式
图文并茂,生动好理解啊!