一、 Message: no such element: Unable to locate element:selenium报错

       最近在使用selenium爬虫时遇到了这个报错,反复检查了自己xpath路径确认没有问题。但是程序还是会报错:“Message: no such element: Unable to locate element: {“method”:“xpath”,“selector”:“//*[@id=“rootWrapper”]/div/div/div/div[2]/div/div[2]/div/div/div/div[2]/div[2]/ul/li[1]”}”。

代码如下:

import time
from selenium import webdriver as wb
import warnings
import pyautogui as pg
from PIL import ImageGrab,Image
import pytesseract
warnings.filterwarnings('ignore')

driver = wb.Chrome(executable_path='D:/cromedriver/chromedriver.exe')
# 登录
driver.get("https://www.xxxxxx.com")
time.sleep(3)
# 窗口一
driver.find_element_by_xpath('//*[@id="root"]/div/div[2]/div[1]/div/div[2]/div/span[1]').click()
#输入用户密码
driver.find_element_by_id('username').send_keys('xxxxxx')
driver.find_element_by_id('password').send_keys('xxxxxx')
driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/div[4]/div/div[2]/form/div[4]/div/div/div/button').click()
# 等待加载
time.sleep(5)

# 窗口二
driver.execute_script('window.open("https://www.xxxxxxx.com/new_yun/#/examPage?exam_id=942&exam_title=%E4%BA%91%E6%9C%8D%E5%8A%A1HCIP20220325&type=prewBank&kind=1&back=2")')
# list_windows = driver.window_handles   # 获取的窗口
# driver.switch_to.window(list_windows[1]) # 跳转窗口

time.sleep(5)
for x in range(1,10):
        # 点击下一题
        driver.find_element_by_xpath('//*[@id="rootWrapper"]/div/div/div/div[2]/div/div[2]/div/div/div/div[2]/div[2]/ul/li['+str(x)+']').click()
        # 点击查看答案
        driver.find_element_by_xpath('//*[@id="rootWrapper"]/div/div/div/div[2]/div/div[2]/div/div/div/div[1]/div/div[2]/div[2]/button').click()
        img1 = ImageGrab.grab(bbox=(120,204,1295,603))
        img1.save('./jt/'+str(x)+'.png')
        img2 = ImageGrab.grab(bbox=(130,745,200,773))
        img2.save('./da/'+str(x)+'.png')

二、解决方案

造成上述问题可能由以下原因导致:

原因一:

       在打开多个窗口的情况下一定要注意selenim到底处于那个窗口上,如上述代码我打开了两个窗口最开始就是没有注意到,其实我的selenim一直处于第一个窗口中。所以我一直是在用第二窗口上的xpath路径在第一个窗口中匹配内容,所以肯定是会报错的。这时就是需要切换到自己的窗口了。代码如下:

首先可以去获取自己打开的窗口:

list_windows = driver.window_handles 

然后在去切换到自己想要的窗口下:

driver.switch_to.window(list_windows[1]) #list_windows 存储了上一步中获取的窗口

原因二:

       在网络不稳定的情况下可能网页并没有完全加载完成,但是这个时候我们已经开始进行xpath路径解析了。这样就会导致找不到我们想要的内容也是会报错。
       这个时候可以让程序这里等待一会,等待页面加载完全在进行访问。等待代码如下:

time.sleep(5)

原因三

       还有一个原因可能就是自己的xpath路径确实是有问题的,大家可以通过谷歌或者火狐的“xpathhelper”插件来测试一下路径是否正确。插件的安装和使用可以百度一下。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐