Python + Selenium WebDriver: Сообщение: элемент не взаимодействует - PullRequest
0 голосов
/ 25 марта 2020

У меня проблема с вводом электронного адреса на следующий веб-сайт: https://isapps.acxiom.com/optout/optout.aspx#section8.

Это код, который я использую:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import os
import time


def acxiom_DD_formfill(title, firstname, middlename, lastname, suffix, email):

    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=chrome_options)
    driver.set_page_load_timeout(10)
    driver.set_window_size(1124, 850) # set browser size
    # link to data delete form
    print("opening data delete form")
    driver.get("https://isapps.acxiom.com/optout/optout.aspx#section8")
    #Select opt out segment: Following option values: "Mail", "Telemarketing", "Email"
    ele = driver.find_element_by_xpath("//select[@id='OptOutChoices2']/option[@value='Mail']") 
    driver.execute_script("arguments[0].click()",ele)
    print("dropdown selected")
    #Select identity: Following option values: "Myself", "Legal guardian", "Deceased person"
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//select[@id='Identity']/option[contains(text(),'Who is opting out?')]"))).click();
    #Select title: Following option values: "Mr.", "Mrs.", "Ms.", "Dr.", "Honorable", "Reverend", "Other"
    ele3 = driver.find_element_by_xpath("//select[@id='Title']/option[@value='Mr.']") 
    driver.execute_script("arguments[0].click()",ele3)
    driver.find_element_by_id("FirstName").send_keys(firstname) 
    driver.find_element_by_id("MiddleName").send_keys(middlename)
    driver.find_element_by_id("LastName").send_keys(lastname)
    driver.find_element_by_id("DDSuffix").send_keys(suffix) 
    driver.find_element_by_id("Email").send_keys(email) 
    # KEEP THIS DISABLED BC IT ACTUALLY SUBMITS 
    # driver.find_element_by_id("SubmitButton2").send_keys(Keys.ENTER)
    print("executed")
    time.sleep(4)
    driver.quit()
    return None

title = "Mr"
middlename = ""
firstname = "Joe"
lastname = "Musterman"
suffix = ""
email = "joe@musterman.com"
acxiom_DD_formfill(title, firstname, middlename, lastname, suffix, email)

Я получаю следующая ошибка:

  Traceback (most recent call last):
  File "website-functions/acxiom.py", line 62, in <module>
    acxiom_DD_formfill(title, firstname, middlename, lastname, suffix, email)
  File "website-functions/acxiom.py", line 49, in acxiom_DD_formfill
    driver.find_element_by_id("Email").send_keys(email)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webelement.py", line 479, in send_keys
  'value': keys_to_typing(value)})
 File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute 
        return self._parent.execute(command, params)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
        self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
      (Session info: headless chrome=80.0.3987.87)

Это HTML поля электронной почты, к которому я пытаюсь получить доступ:

image

Правильно ли мне взаимодействовать со следующими HTML элемент?

<input name="Email" type="email" maxlength="50" id="Email" class="form-control iEmail" placeholder="Email Address" novalidate="novalidate">

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Причина, по которой вы получаете ошибку, потому что в вашем первом раскрывающемся списке не выбрано значение email, следовательно, поле Email не генерируется. Вам нужно выбрать адрес электронной почты из раскрывающегося списка. Попробуйте следующий код.

from selenium import webdriver
#from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import os
import time


def acxiom_DD_formfill(title, firstname, middlename, lastname, suffix, email):

    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=chrome_options)
    driver.set_page_load_timeout(10)
    driver.set_window_size(1124, 850) # set browser size
    # link to data delete form
    print("opening data delete form")
    driver.get("https://isapps.acxiom.com/optout/optout.aspx#section8")
    WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div.ss-values"))).click()
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.ss-values"))).click()
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='ss-option' and contains(.,'Email')]"))).click()
    print("dropdown selected")
    #Select identity: Following option values: "Myself", "Legal guardian", "Deceased person"
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//select[@id='Identity']/option[contains(text(),'Who is opting out?')]"))).click();
    #Select title: Following option values: "Mr.", "Mrs.", "Ms.", "Dr.", "Honorable", "Reverend", "Other"
    ele3 = driver.find_element_by_xpath("//select[@id='Title']/option[@value='Mr.']")
    driver.execute_script("arguments[0].click()",ele3)
    driver.find_element_by_id("FirstName").send_keys(firstname)
    driver.find_element_by_id("MiddleName").send_keys(middlename)
    driver.find_element_by_id("LastName").send_keys(lastname)
    driver.find_element_by_id("DDSuffix").send_keys(suffix)
    WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,'Email'))).send_keys(email)
    #driver.find_element_by_id("Email").send_keys(email)
    # KEEP THIS DISABLED BC IT ACTUALLY SUBMITS
    # driver.find_element_by_id("SubmitButton2").send_keys(Keys.ENTER)
    print("executed")
    time.sleep(10)
    driver.quit()
    return None

title = "Mr"
middlename = ""
firstname = "Joe"
lastname = "Musterman"
suffix = ""
email = "joe@musterman.com"
acxiom_DD_formfill(title, firstname, middlename, lastname, suffix, email)
0 голосов
/ 25 марта 2020

Альтернативное решение:

from selenium import webdriver
#from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import os
import time


def acxiom_DD_formfill(title, firstname, middlename, lastname, suffix, email):
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=chrome_options)
    driver.set_page_load_timeout(10)
    driver.set_window_size(1124, 850) # set browser size
    # link to data delete form
    print("opening data delete form")
    driver.get("https://isapps.acxiom.com/optout/optout.aspx#section8")
    #Select opt out segment: Following option values: "Mail", "Telemarketing", "Email"

    dropdown=WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, "ss-multi-selected")))
    dropdown.click()
    WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CLASS_NAME,'ss-option')))
    list_options = driver.find_elements_by_class_name('ss-option')
    list_options[2].click()

    print("dropdown selected")
    #Select identity: Following option values: "Myself", "Legal guardian", "Deceased person"
    identity_dropdown = driver.find_element_by_id('Identity')
    select = Select(identity_dropdown)
    select.select_by_value('Submitter')

    #Select title: Following option values: "Mr.", "Mrs.", "Ms.", "Dr.", "Honorable", "Reverend", "Other"
    title_dropdown=driver.find_element_by_id('Title')
    select = Select(title_dropdown)
    select.select_by_value(title)

    driver.find_element_by_id("FirstName").send_keys(firstname)
    driver.find_element_by_id("MiddleName").send_keys(middlename)
    driver.find_element_by_id("LastName").send_keys(lastname)
    driver.find_element_by_id("DDSuffix").send_keys(suffix)
    driver.find_element_by_id("Email").send_keys(email)
    # KEEP THIS DISABLED BC IT ACTUALLY SUBMITS
    # driver.find_element_by_id("SubmitButton2").send_keys(Keys.ENTER)
    print("executed")
    time.sleep(4)
    driver.quit()
    return None

title = "Mr."
middlename = ""
firstname = "Joe"
lastname = "Musterman"
suffix = ""
email = "joe@musterman.com"
acxiom_DD_formfill(title, firstname, middlename, lastname, suffix, email)

Некоторые примечания:

  • Я обнаружил сбой подхода execute_script как в раскрывающихся списках Optout, так и в раскрывающихся заголовках ( по крайней мере, на моей машине).
  • Я добавил реализацию выбора «Кто отказывается».
  • Из-за конкретной структуры DOM подход с использованием веб-драйвера Select невозможен для список Optout, но это, безусловно, выполнимо для тех, кто отказывается от участия и списков заголовков (см. выше).
  • По крайней мере, при создании сценария / отладки рекомендуется не запускать в режиме --headless , Таким образом, вы сможете увидеть, что ваш скрипт на самом деле делает на веб-странице, и это может помочь вам лучше понять ошибки, которые вы получаете (этот вопрос является хорошим примером)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...