自动化踩坑记之——怎么元素又定位不到了?

刚入门自动化的时候,觉得会很简单。不就是find_element,click吗,非常潇洒的敲了几行代码,一执行:

file
理想很丰满,现实很骨感。为什么呢?元素怎么定位不到呢?

先检查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。反之亦然。
file

   tag = 'tencent'
    contexts = self.driver.contexts
    for context in contexts:
        if tag in context:
            self.driver.switch_to.context(context)

如何判断改切至哪个webview呢?
在网页端查看当前手机端界面时,即会显示所在的webview。如若此处不显示,则为Native页面。
file
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标签
file
4.2.如若定位时没有iframe标签,则如图位置再次确认
file

讨论数量: 3

总结很重要,不错

4年前

如果是微信公众号的话 还有可能没有打开微信的调试模式

4年前

图文并茂,生动好理解啊!

4年前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!