使用NODRIVER跨页面导航触发NoneType AttributeError问题求助
解决NODRIVER多页面导航时的AttributeError问题
问题场景
使用NODRIVER实现多页面导航:已成功访问网站首页,通过mouse_move触发下拉菜单,点击下拉项pay_per_visit进入第二页。尝试将点击后的结果存入test1并调用其find方法时,触发AttributeError: 'NoneType' object has no attribute 'find'错误。
错误原因
pay_per_visit.click()执行页面跳转后返回值为None,并非新页面的Page对象,直接用该值调用find方法必然报错。此外,代码注释掉了await driver.wait_for_navigation(),导致页面未完成跳转就执行后续查找操作,进一步加剧问题。
修复方案
- 点击跳转后必须等待页面导航完成,确保新页面加载完毕
- 使用当前活动标签页(
driver.main_tab)执行新页面的元素查找,而非点击操作的返回值
修改后的核心代码片段
pay_per_visit = await page.find('/html/body/nav/div/ul/li[4]/div/div/div[2]/div/a') await pay_per_visit.click() # 等待页面导航完成,确保新页面加载完毕 await driver.wait_for_navigation() print("Navigated to new page") # 使用driver.main_tab获取当前活动标签页的Page对象,执行元素查找 swing = await driver.main_tab.find('/html/body/div[2]/div/div/ul/li[1]/div/a/span')
完整修复代码
import asyncio import nodriver as uc from time import sleep url1 = 'https://www.mytpi.com/' async def b_start_chrome_and_log_in(): print("start chrome") driver = await uc.start() await driver.main_tab.maximize() page = await driver.get(url1) print("Website loaded") improve = await page.find('/html/body/nav/div/ul/li[4]/a') print("found drop down") sleep(10) await improve.mouse_move() print("hover worked") sleep(1) pay_per_visit = await page.find('/html/body/nav/div/ul/li[4]/div/div/div[2]/div/a') await pay_per_visit.click() # 等待导航完成,这一步必须保留 await driver.wait_for_navigation() print("Navigated to new page") # 改用driver.main_tab查找新页面元素 swing = await driver.main_tab.find('/html/body/div[2]/div/div/ul/li[1]/div/a/span') print("Found swing characteristics:", swing) await driver.close() asyncio.run(b_start_chrome_and_log_in())
额外提示
- 避免使用硬编码XPath,尽量改用class、id等更稳定的选择器,防止页面结构变动导致定位失败
- 优先用
asyncio.sleep()替代time.sleep(),避免阻塞事件循环
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

