selenium.common.exceptions.ElementNotInteractableException: Сообщение: элемент не взаимодействует при нажатии на элемент с использованием Selenium Python - PullRequest
0 голосов
/ 19 марта 2019

Я понимаю, что этот вопрос был задан, но мне нужно какое-то решение для этой ошибки:

 Traceback (most recent call last):
 File "goeventz_automation.py", line 405, in <module>
if login(driver) is not None:
File "goeventz_automation.py", line 149, in login
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@track-element='header-login']"))).click()
File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/support/wait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

Это код, в котором появляется ошибка:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import TimeoutException
import urllib.request as request
import urllib.error as error
from PIL import Image
from selenium.webdriver.chrome.options import Options
import datetime as dt
import time
from common_file import *
from login_credentials import *

def login(driver):
global _email, _password
if waiter(driver, "//a[@track-element='header-login']") is not None:
    #login = driver.find_element_by_xpath("//a[@track-element='header-login']")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@track-element='header-login']"))).click()
    #login.click()
    if waiter(driver,"//input[@id='user_email']") is not None:
        email = driver.find_element_by_xpath("//input[@id='user_email']")
        password = driver.find_element_by_xpath("//input[@id='password']")
        email.send_keys(_email)
        password.send_keys(_password)
        driver.find_element_by_xpath("//button[@track-element='click-for-login']").click()
        return driver
    else:
        print("There was an error in selecting the email input field. It may be the page has not loaded properly.")
        return None
else:
    print("There was an error in selecting the header-login attribute on the page.")
    return None

if __name__ == '__main__':
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')

    driver = webdriver.Chrome('/usr/bin/chromium/chromedriver',chrome_options=chrome_options)
    #d.get('https://www.google.nl/')
    #driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.goeventz.com/')
    if login(driver) is not None:
        print(create_event(driver))

Я думаю, что естькакая-то проблема с Keys.ENTER, но я не знаю, как это решить.Я испробовал все возможные решения .............

Ответы [ 4 ]

1 голос
/ 19 марта 2019

Для браузера без головы вам нужно указать размер окна, а также в настройках Chrome. Для браузера без головы селен не может определить размер вашего окна. Попробуйте и сообщите мне.

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('window-size=1920x1480')
1 голос
/ 19 марта 2019

Это сообщение об ошибке ...

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

... подразумевает, что требуемый элемент не был интерактивным , когда вы пытались вызвать click() для него.

Пара фактов:

  • При инициализации браузера Chrome всегда в режиме развернутый .
  • Вы можете отключить расширение .
  • Вам также необходимо отключить инфобары .

Я использовал тот же xpath , который вы создали, и вы можете использовать следующее решение:

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    options = webdriver.ChromeOptions()
    options.add_argument("start-maximized");
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.goeventz.com/")
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@track-element='header-login']"))).click()
    
  • Снимок браузера:

login_page

1 голос
/ 19 марта 2019

Обзор

Похоже, у вас возникла проблема с XPATH, когда вы обнаружили, что кнопка «Отправить» или ваша кнопка «Отправить» недоступна, или к вашей кнопке «Отправить» прикреплены некоторые события на стороне клиента (javascript / etc), которые необходимы для эффективной отправки страницы.

Вызов метода pw.submit () в большинстве случаев должен избавить от необходимости ждать, пока кнопка отправки станет кликабельной, и избежать проблем с поискомкнопка в большинстве случаев.На многих других веб-сайтах некоторые из необходимых внутренних процессов запускаются действиями на стороне клиента, которые выполняются после того, как кнопка «отправить» фактически нажата (хотя для примечания это не считается наилучшей практикой, посколькусайт менее доступен и т. д. я отвлекся).Прежде всего, важно следить за выполнением вашего скрипта и следить за тем, чтобы на веб-странице не отображалось никаких заметных ошибок в отношении учетных данных, которые вы отправляете.

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

from random import random, randint

def sleepyTime(first=5, second=10):
    # returns the value of the time slept (as float)
    # sleeps a random amount of time between the number variable in first
    # and the number variable second (in seconds)
    sleepy_time = round(random() * randint(first, second), 2)
    sleepy_time = sleepy_time if sleepy_time > first else (first + random())
    sleep(sleepy_time)
    return sleepy_time

Я не вижу, что вы используете для создания глобальных переменных _email и _password, если только они не изменяются где-то в функции входа в системуи вы хотите, чтобы это изменение было перенесено на другие сферы.

Как бы я попытался его решить

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException, TimeoutException

TIME_TIMEOUT = 20 # Twenty-second timeout default

def eprint(*args, **kwargs):
    """ Prints an error message to the user in the console (prints to sys.stderr), passes
    all provided args and kwargs along to the function as usual. Be aware that the 'file' argument
    to print can be overridden if supplied again in kwargs.
    """
    print(*args, file=sys.stderr, **kwargs)


def login(driver):
    global _email, _password
    try:
        email = WebDriverWait(driver, TIME_TIMEOUT).until(EC.presence_of_element_located((By.XPATH, "//input[@id='user_email']")))
        pw = WebDriverWait(driver, TIME_TIMEOUT).until(EC.presence_of_element_located((By.XPATH, "//input[@id='password']"))
        pw.submit()
        # if this doesn't work try the following:
        # btn_submit = WebDriverWait(driver, TIME_TIMEOUT).until(EC.element_to_be_clickable((By.XPATH, "//button[@track-element='click-for-login']"))
        # btn_submit.click() 
        # if that doesn't work, try to add some random wait times using the 
        # sleepyTime() example from above to add some artificial waiting to your email entry, your password entry, and the attempt to submit the form.

except NoSuchElementException as ex:
    eprint(ex.msg())

except TimeoutException as toex:
    eprint(toex.msg)

if __name__ == '__main__':
    driver = webdriver.Chrome('/usr/bin/chromium/chromedriver',chrome_options=chrome_options)
    #d.get('https://www.google.nl/')
    #driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.goeventz.com/')
    if login(driver) is not None:
        print(create_event(driver))
1 голос
/ 19 марта 2019

Вместо использования login.send_keys(Keys.ENTER) вы должны использовать метод селена click(), который вам подходит.

Сначала вы можете проверить, активен ли элемент, а затем нажать на него.Нравится:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@track-element='header-login']"))).click()
...