【问题标题】: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')
      

      结果截图为:

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多