【问题标题】:Headless chrome cannot detect elements(selenium)无头铬无法检测元素(硒)
【发布时间】:2020-03-10 17:37:18
【问题描述】:

在非无头模式下运行良好,但在无头模式下不会检测到任何元素。

代码

网址:https://moneyforward.com/users/sign_in

我想输入邮件地址和密码,然后在无头模式下单击按钮。

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary

options = Options()
options.add_argument("--headless")
options.add_argument("--disable-gpu")
driver = webdriver.Chrome(options=options)

driver.get("https://moneyforward.com/users/sign_in")

time.sleep(5)


# type into mail_address
driver.find_element_by_id('sign_in_session_service_email').send_keys({mail_address}])

# type into passowrd
driver.find_element_by_id('sign_in_session_service_password').send_keys({password})

# click login button
driver.find_element_by_id("login-btn-sumit").click()

报错说明如下。

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="sign_in_session_service_email"]"}
  (Session info: headless chrome=80.0.3987.132)

为什么在非无头模式下工作时它在无头模式下工作?帮帮我。

【问题讨论】:

    标签: python selenium google-chrome selenium-webdriver


    【解决方案1】:

    我把你的代码修改了一下,最后执行了,执行结果如下:

    • 代码块:

      from selenium import webdriver
      
      options = webdriver.ChromeOptions()
      options.headless = True
      options.add_argument('window-size=1400,600')
      options.add_experimental_option("excludeSwitches", ["enable-automation"])
      options.add_experimental_option('useAutomationExtension', False)
      
      driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
      driver.get('https://moneyforward.com/users/sign_in')
      print(driver.page_source)
      driver.save_screenshot('./save_screenshot_method.png') #Capture the screen
      driver.quit()
      
    • 控制台输出:

      <html><head></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">Forbidden</pre></body></html>
      
    • 浏览器快照:


    分析

    似乎ChromeDriver 驱动的 正在被检测到,并且显示为Access Denied 消息Forbidden


    解决方案

    作为一种解决方案,您可以采用一些策略,以便 ChromeDriver 驱动的 Chrome 浏览上下文 不会被检测到,您可以在以下位置找到一些详细的讨论:

    【讨论】:

      【解决方案2】:

      尝试等待元素而不是仅仅使用硬编码的睡眠:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC    
      
      WebDriverWait(driver, 20).until(
                      EC.presence_of_element_located((By.ID, "sign_in_session_service_email"))
      

      在您尝试将睡眠调高到更高的等待时间之前,只需进行调试即可。

      也有可能是在无头模式下,您的“屏幕尺寸”配置不正确,导致对屏幕的响应反应导致元素发生变化。

      【讨论】:

        【解决方案3】:

        您正在访问的页面似乎不允许无头浏览器模式。尝试打印 HTML 页面并查看它是否返回所有元素。我尝试添加以下语句,看起来应用程序返回了禁止页面。

        print(driver.find_element_by_xpath('//*').get_attribute("innerHTML"))

        我是从你分享的 URL 中得到的。

        禁止

        可以参考Chrome headless options调试

        【讨论】:

          猜你喜欢
          • 2018-04-14
          • 2018-06-23
          • 1970-01-01
          • 1970-01-01
          • 2017-12-23
          • 2021-01-26
          • 2020-07-23
          • 2019-09-30
          • 1970-01-01
          相关资源
          最近更新 更多