Selenium通过Class Name定位Instagram弹窗按钮超时问题求助
Instagram登录后关闭弹窗失败问题解决
已登录Instagram,尝试点击「Not Now」按钮关闭弹窗,但无论如何操作都会报错,以下是相关代码(用户名和密码已替换)、错误日志及目标元素结构:
原代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time path = "\/Users/almogbenlulu/Desktop/Almog/python/chromedriver.exe" s = Service(path) driver = webdriver.Chrome(service=s) driver.get("\https://www.instagram.com/") WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.NAME, 'username'))) driver.find_element(By.NAME, "\username").send_keys("\*****") driver.find_element(By.NAME, "\password").send_keys("\*****") driver.find_element(By.XPATH, '//*[@id=\"loginForm\"]/div/div[3]/button/div').click() WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, '_acan _acao _acas'))) driver.find_element(By.CLASS_NAME, '_acan _acao _acas').click() driver.quit()
错误日志
Traceback (most recent call last): File "\/Users/almogbenlulu/Desktop/Almog/python/Automation/venv/day1/insta.py", line 22, in <module> WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, '_acan _acao _acas'))) File "\/Users/almogbenlulu/Desktop/Almog/python/Automation/venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py", line 95, in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: Stacktrace: 0 chromedriver 0x00000001048052c8 chromedriver + 4752072 1 chromedriver 0x0000000104785463 chromedriver + 4228195 2 chromedriver 0x00000001043e8b18 chromedriver + 441112 3 chromedriver 0x0000000104425e21 chromedriver + 691745 4 chromedriver 0x0000000104426061 chromedriver + 692321 5 chromedriver 0x00000001044615e4 chromedriver + 935396 6 chromedriver 0x0000000104446d2d chromedriver + 826669 7 chromedriver 0x000000010445f134 chromedriver + 926004 8 chromedriver 0x0000000104446b33 chromedriver + 826163 9 chromedriver 0x00000001044179fd chromedriver + 633341 10 chromedriver 0x0000000104419051 chromedriver + 639057 11 chromedriver 0x00000001047d230e chromedriver + 4543246 12 chromedriver 0x00000001047d6a88 chromedriver + 4561544 13 chromedriver 0x00000001047de6df chromedriver + 4593375 14 chromedriver 0x00000001047d78fa chromedriver + 4565242 15 chromedriver 0x00000001047ad2cf chromedriver + 4391631 16 chromedriver 0x00000001047f65b8 chromedriver + 4691384 17 chromedriver 0x00000001047f6739 chromedriver + 4691769 18 chromedriver 0x000000010480c81e chromedriver + 4782110 19 libsystem_pthread.dylib 0x00007ff8188bd4e1 _pthread_start + 125 20 libsystem_pthread.dylib 0x00007ff8188b8f6b thread_start + 15 Process finished with exit code 1
目标元素结构
<div class="_ac8f"><button class="_acan _acao _acas" type="button">Not Now</button></div>
问题原因及解决方法
- By.CLASS_NAME不支持多类名:使用
By.CLASS_NAME, '_acan _acao _acas'定位元素是错误的,Selenium的By.CLASS_NAME仅支持单个类名,多类名会导致定位失败。 - 多余转义字符干扰:代码中路径、URL、NAME参数里的
\属于多余转义,会导致解析错误,需直接移除。
修正后的代码
推荐两种稳定的定位方式:
方式一:CSS_SELECTOR定位多类名元素
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC path = "/Users/almogbenlulu/Desktop/Almog/python/chromedriver.exe" s = Service(path) driver = webdriver.Chrome(service=s) driver.get("https://www.instagram.com/") # 等待用户名输入框可见 WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.NAME, 'username'))) # 输入用户名和密码 driver.find_element(By.NAME, "username").send_keys("*****") driver.find_element(By.NAME, "password").send_keys("*****") # 点击登录按钮 driver.find_element(By.XPATH, '//*[@id="loginForm"]/div/div[3]/button/div').click() # 等待弹窗按钮可点击并触发点击 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "._acan._acao._acas"))).click() driver.quit()
方式二:XPATH按按钮文本定位
若Instagram类名频繁变更,按文本定位更稳定:
# 替换等待及点击的代码段 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Not Now']"))).click()
内容的提问来源于stack exchange,提问作者Almog Ben-Lulu
相关产品推荐
相关产品推荐

