【问题标题】:Python + Selenium WebDriver: Message: element not interactablePython + Selenium WebDriver:消息:元素不可交互
【发布时间】:2020-03-25 10:52:15
【问题描述】:

我在将电子邮件输入以下网站时遇到问题: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:

<div class="formsection " id="EmailSection">
                                <div id="EmailAddressPanel">

                                        <div onkeypress="javascript:return WebForm_FireDefaultButton(event, 'AddEmail2')">

                                            <div class="listPanel">
                                                <div id="EmailAddressInputGroup">
                                                    <table class="formsection-table">
                                                        <tbody><tr>
                                                            <td>
                                                                <input name="Email" type="email" maxlength="50" id="Email" class="form-control iEmail" placeholder="Email Address" novalidate="novalidate">
                                                            </td>
                                                            <td>
                                                                <span class="tooltip">
                                                                    <img src="images/img-question-mark-bubble.svg" alt="Email information">
                                                                    <span class="tooltiptext">Add all email address variations
                                                                    </span>
                                                                </span>
                                                            </td>
                                                            <td>
                                                                <input type="submit" name="AddEmail2" value="" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;AddEmail2&quot;, &quot;&quot;, true, &quot;EMail&quot;, &quot;&quot;, false, false))" id="AddEmail2" title="Add Email Address to list" class="btn btn-formsection invisible" alternatetext="Add Email Address to list">
                                                            </td>
                                                        </tr>
                                                    </tbody></table>

                                                    <span id="EmailRegexValidator" class="error-message" style="display:none;">
                                                        Please enter a valid email address.
                                                    </span>
                                                    <span id="AllowedCharactersInEmailValidator" class="error-message" style="display:none;">
                                                        Invalid characters have been removed.
                                                    </span>
                                                    <span id="SingleValidEmailValidator" class="error-message" style="display:none;">
                                                        Please enter a single valid email address.
                                                    </span>
                                                    <span id="EmailNotAddedValidator" class="error-message" style="display:none;">
                                                        Click the <img src="images/close.svg"> button to add the email entered above or clear the field(s) before Submitting form.
                                                    </span>
                                                    <span id="MaxEmailEntriesValidator" class="error-message" style="display:none;"></span>
                                                </div>
                                                <span id="OneEmailRequiredValidator" class="error-message" style="display:none;">
                                                    Please add at least one email address.
                                                </span>
                                                <div>

            </div>
                                            </div>

        </div>

    </div>
                            </div>

我需要与以下 HTML 元素交互是否正确?

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

感谢您的帮助!

【问题讨论】:

    标签: python-3.x selenium webdriver


    【解决方案1】:

    您收到错误的原因是因为您的第一个下拉列表未选择值电子邮件,因此未生成电子邮件字段。您需要从下拉列表中选择电子邮件。试试下面的代码。

    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)
    

    【讨论】:

      【解决方案2】:

      另一种解决方案:

      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 结构,webdriver Select 方法 选择退出列表是不可能的,但对于 谁选择退出和标题列表(见上文)。
      • 至少在创建脚本/调试时,最好不要 在--headless 模式下运行。这样你就可以看到你的脚本 实际上在网页上确实如此,它可能会帮助您更好地理解 你得到的错误(这个问题就是一个很好的例子)

      【讨论】:

      • 感谢您的回答!我希望不在无头模式下运行代码。但是,如果没有该选项,我会收到以下错误:` File "other/acxiom-test.py", line 21, in acxiom_DD_formfill driver = webdriver.Chrome(options=chrome_options)` ... selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/chromium-browser is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多