bulb~ 2024-04-12 20:59 采纳率: 100%
浏览 37
已结题

关于#python#的问题:滑块验证但是定位不到元素

淘宝登录需要滑块验证,但是XPATH定位元素块却报错“selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: ”,通过打印页面源码,却显示该元素块存在

报错信息:

img

代码如下:

from selenium import (webdriver)
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time

# 打开网页
options = webdriver.ChromeOptions()
options.add_argument('disable-blink-features=AutomationControlled')
options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=options)
url = 'https://login.taobao.com/member/login.jhtml?spm=a21bo.jianhua/a.profile.1.5af92a89htDy32&f=top&redirectURL=http%3A%2F%2Fwww.taobao.com%2F'
driver.get(url)
driver.maximize_window()

# 登录
driver.implicitly_wait(5)
id = driver.find_element(By.XPATH, '//input[@id="fm-login-id"]')
password = driver.find_element(By.XPATH, '//input[@id="fm-login-password"]')
login_button = driver.find_element(By.XPATH, '//button[@class="fm-button fm-submit password-login"]')
id.send_keys('id')
password.send_keys('password')
login_button.click()

# 滑动验证
driver.implicitly_wait(5)
slider = driver.find_element(By.XPATH,
                             '//div[@id="nocaptcha"]/div[@id="nc_1_nocaptcha"]/div[@id="nc_1_wrapper"]/div[@id="nc_1_n1t"]/span[@id="nc_1_n1z"]')
action = ActionChains(driver)
action.click_and_hold(slider).perform()
action.move_by_offset(258, 0).perform()
action.release().perform()

# 确认保留登录信息
driver.implicitly_wait(5)
try:
    driver.implicitly_wait(5)
    confirm_button = driver.find_element(By.XPATH, 'button[@class="keep-login-btn keep-login-confirm-btn primary"]')
    confirm_button.click()
except Exception:
    pass

time.sleep(1000)
driver.quit()


  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-12 21:00
    关注

    引自免费微信小程序:皆我百晓生

    看起来你正在尝试使用Selenium进行自动化操作,但遇到了NoSuchElementException。这个错误通常表示Selenium在指定的位置没有找到预期的元素。

    根据你提供的报错信息,滑块元素的XPath是这样的:

    //div[@id="nocaptcha"]/div[@id="nc_1_nocaptcha"]/div[@id="nc_1_wrapper"]/div[@id="nc_1_n1t"]/span[@id="nc_1_n1z"]
    

    然而,Selenium未能找到这个元素。这可能有几种原因:

    1. 元素加载延迟:滑块验证可能是在页面加载后动态添加的。
    2. XPath表达式不准确:有时候XPath可能会因为页面结构改变而失效。
    3. 浏览器设置问题:某些隐私设置可能阻止了滑块验证元素的渲染。
    4. iframe嵌套:滑块验证元素可能位于iframe内,你需要先切换到那个iframe。

    首先,让我们确保页面已经完全加载,并且滑块元素确实存在。我们可以通过等待特定条件(例如元素可见)来实现这一点。下面是一个使用WebDriverWait的例子:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 添加一个函数来检查滑块是否可见
    def is_slider_visible(driver):
        try:
            slider = driver.find_element(By.XPATH, '//div[@id="nocaptcha"]/div[@id="nc_1_nocaptcha"]/div[@id="nc_1_wrapper"]/div[@id="nc_1_n1t"]/span[@id="nc_1_n1z"]')
            return slider.is_displayed()
        except NoSuchElementException:
            return False
    
    # 等待滑块元素可见
    wait = WebDriverWait(driver, 10)
    while not is_slider_visible(driver):
        wait.until(is_slider_visible)
    
    # 获取并操作滑块
    slider = driver.find_element(By.XPATH,
                                 '//div[@id="nocaptcha"]/div[@id="nc_1_nocaptcha"]/div[@id="nc_1_wrapper"]/div[@id="nc_1_n1t"]/span[@id="nc_1_n1z"]')
    
    # 其他滑动逻辑...
    

    如果你确定XPath表达式正确并且页面已加载完成,那么可能是滑块元素位于iframe内。在这种情况下,你需要切换到包含滑块的iframe,然后再次查找元素。这里是如何做这件事的示例:

    # 查找iframe
    iframes = driver.find_elements(By.TAG_NAME, "iframe")
    for iframe in iframes:
        # 判断iframe的src属性是否与滑块相关联
        if "nocaptcha" in iframe.get_attribute("src"):
            driver.switch_to.frame(iframe)
            break
    
    # 现在应该可以在iframe内找到滑块元素
    slider = driver.find_element(By.XPATH,
                                 '//div[@id="nocaptcha"]/div[@id="nc_1_nocaptcha"]/div[@id="nc_1_wrapper"]/div[@id="nc_1_n1t"]/span[@id="nc_1_n1z"]')
    
    # 如果完成滑动操作,记得返回主窗口
    driver.switch_to.default_content()
    
    # 其他滑动逻辑...
    

    请尝试这些修改并告诉我结果如何。如果有任何其他问题或需要进一步的帮助,请随时告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月21日
  • 已采纳回答 4月13日
  • 创建了问题 4月12日