Python + Selenium WebDriver:消息:元素不可交互
Python + Selenium WebDriver: Message: element not interactable
我在将电子邮件输入以下网站时遇到问题: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("AddEmail2", "", true, "EMail", "", 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">
感谢您的帮助!
您收到错误的原因是因为您的第一个下拉菜单没有 select 值 email 因此电子邮件字段不是 generated.You 需要 select 来自 drop down.Try 下面的代码。
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)
另一种解决方案:
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 下拉菜单上都失败了
和标题下拉菜单(至少在我的机器上)。
- 我添加了 "Who is opting out" 选择实现。
- 由于特殊的 DOM 结构,webdriver
Select
方法
Optout 列表是不可能的,但它肯定是可行的
谁选择退出和标题列表(见上文)。
- 至少在创建 script/debugging 时,最好不要
运行 在
--headless
模式。这样你就可以看到你的脚本
实际上在网页上确实如此,它可能会帮助您更好地理解
你得到的错误(这个问题就是一个很好的例子)
我在将电子邮件输入以下网站时遇到问题: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("AddEmail2", "", true, "EMail", "", 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">
感谢您的帮助!
您收到错误的原因是因为您的第一个下拉菜单没有 select 值 email 因此电子邮件字段不是 generated.You 需要 select 来自 drop down.Try 下面的代码。
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)
另一种解决方案:
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 下拉菜单上都失败了 和标题下拉菜单(至少在我的机器上)。 - 我添加了 "Who is opting out" 选择实现。
- 由于特殊的 DOM 结构,webdriver
Select
方法 Optout 列表是不可能的,但它肯定是可行的 谁选择退出和标题列表(见上文)。 - 至少在创建 script/debugging 时,最好不要
运行 在
--headless
模式。这样你就可以看到你的脚本 实际上在网页上确实如此,它可能会帮助您更好地理解 你得到的错误(这个问题就是一个很好的例子)