在非无头模式下运行时效果很好,但在无头模式下没有检测到元素。
url:https://moneyforward.com/users/sign_in
我想输入mail_address和密码,然后在无头模式下单击按钮。
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)
为什么它在非无头模式下不能在无头模式下工作?救救我。
答案 0 :(得分:0)
尝试等待该元素,而不仅仅是使用硬编码的睡眠:
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"))
在尝试增加睡眠时间之前,请先进行调试。
在无头模式下,您的“屏幕尺寸”可能配置不正确,并且会引起对屏幕的响应,从而导致元素发生变化。
答案 1 :(得分:0)
您正在访问的页面似乎不允许无头浏览器模式。尝试打印HTML页面,看看它是否返回所有元素。我通过添加以下语句进行了尝试,看起来应用程序返回了禁止页面。
print(driver.find_element_by_xpath('// *')。get_attribute(“ innerHTML”))
我是从您共享的URL上获得的。
禁止
您可以参考Chrome headless options进行调试
答案 2 :(得分:0)
我拿了你的代码并做了一些修改,最后执行了,这是执行结果:
代码块:
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驱动的google-chrome-headless被检测到,并且Access Denied显示了消息禁止。
作为解决方案,您可以采用一些策略,这样就不会检测到 ChromeDriver 驱动的 Chrome浏览上下文,您可以在以下位置找到一些详细的讨论: