【问题标题】:Possible security feature that disables automation?禁用自动化的可能安全功能?
【发布时间】:2023-01-10 17:54:12
【问题描述】:
我正在使用 Selenium Chrome Webdriver 制作一个 Python 脚本来自动化这个网站:https://nordicwellness.se/logga-in/?redirecturl=/mina-sidor/(这是一个瑞典网站)。
我正在尝试使登录过程自动化,但我不断收到以下错误:
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
和
Keyboard not reachable
我正在使用以下代码来定位电子邮件输入字段和密码输入字段:
emailInp = driver.find_element(By.XPATH, '//*[@id="UserName"]').send_keys('test')
passwordInp = driver.find_element(By.XPATH, '//*[@id="Password"]').send_keys('123')
我试过传递多个 options 甚至使用 WebDriverWait 函数,甚至尝试过 Firefox 和 Safari,但似乎没有任何效果。
该网站是否可能具有某种不允许自动脚本的安全功能?如果是这样,有没有办法绕过它?
【问题讨论】:
标签:
python
selenium
selenium-webdriver
xpath
webdriver
【解决方案1】:
我相信这是由于您的 XPath。如果您检查页面本身中的 Web 元素,实际上有 3 个元素与您输入的 XPath //*[@id="UserName"] 匹配。如果不指定,Selenium 将始终匹配第一个返回元素。隐藏在顶部菜单中。这就是为什么您会收到元素不可交互错误的原因。
一个快速的解决方案是使用直接完整的 XPath,如下所示:
emailInp = driver.find_element(By.XPATH, '/html/body/div[1]/main/div/div/div/form/input[1]').send_keys('test')
passwordInp = driver.find_element(By.XPATH, '/html/body/div[1]/main/div/div/div/form/input[2]').send_keys('123')
或者您需要专门过滤掉您尝试访问的//*[@id="UserName"],例如:
emailInp = driver.find_element(By.XPATH, '//main//*[@id="UserName"]').send_keys('test')
passwordInp = driver.find_element(By.XPATH, '//main//*[@id="Password"]').send_keys('123')
【解决方案2】:
您使用的不是唯一的定位器。有 3 个元素匹配 //*[@id="UserName"] 和 //*[@id="Password"] 定位器。
定位器应该始终是唯一的。在这种情况下,您需要考虑唯一父元素以使定位器唯一。
以下代码有效:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument("start-maximized")
webdriver_service = Service('C:webdriverschromedriver.exe')
driver = webdriver.Chrome(options=options, service=webdriver_service)
wait = WebDriverWait(driver, 10)
url = "https://nordicwellness.se/logga-in/?redirecturl=/mina-sidor/"
driver.get(url)
wait.until(EC.element_to_be_clickable((By.XPATH, "//main//input[@id='UserName']"))).send_keys('test')
wait.until(EC.element_to_be_clickable((By.XPATH, "//main//input[@id='Password']"))).send_keys('123')
结果截图为: