Безголовый chrome не может обнаружить элементы (селен) - PullRequest
0 голосов
/ 10 марта 2020

Хорошо работает, когда выполняется в режиме без заголовка, но в режиме без заголовка элементы не обнаружены.

код

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)

Почему не работает в режиме без заголовка когда он работает в безголовом режиме? Помоги мне.

Ответы [ 3 ]

0 голосов
/ 10 марта 2020

Кажется, что страница, к которой вы обращаетесь, не поддерживает режим браузера без головы Попробуйте напечатать страницу HTML и посмотрите, вернет ли она все элементы. Я попытался, добавив следующее утверждение, и похоже, что приложение возвращает запрещенную страницу.

print (driver.find_element_by_xpath ('// *'). Get_attribute ("inner HTML"))

Я получил это по URL-адресу, которым вы поделились.

Запрещено

Вы можете обратиться к Chrome безголовым опциям для отладки

0 голосов
/ 11 марта 2020

Я взял ваш код, немного изменил его и выполнил на своем конце, и вот результат выполнения:

  • Блок кода:

    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()
    
  • Вывод на консоль:

    <code><html><head></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">Forbidden
  • Снимок браузера:

save_screenshot_method.png


Анализ

Кажется ChromeDriver управляемый обнаруживается и становится Доступ запрещен отображается сообщение Запрещено .


Решение

В качестве решения вы можете использовать некоторые стратегии, поэтому ChromeDriver driven Chrome Контекст просмотра не обнаружен, и вы можете найти несколько подробных обсуждений в:

0 голосов
/ 10 марта 2020

Попытайтесь дождаться элемента, а не просто использовать жестко закодированный сон:

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"))

Прежде чем пытаться перевести сон в режим ожидания с более высоким ожиданием, просто выполните отладку.

Также возможно, что в режиме без монитора ваш «размер экрана» не настроен правильно и вызывает реакцию на экран, вызывая изменение элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...