Search code examples
pythonseleniumselenium-webdriverxpathwebdriver

Possible security feature that disables automation?


I am making a Python script with the Selenium Chrome Webdriver to automate this website: https://nordicwellness.se/logga-in/?redirecturl=/mina-sidor/ (it's a Swedish website).

I am trying to automate the login process but I keep getting errors such as:

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

and

Keyboard not reachable

I am using the following code to locate the email input field and password input field:

emailInp = driver.find_element(By.XPATH, '//*[@id="UserName"]').send_keys('test')
passwordInp = driver.find_element(By.XPATH, '//*[@id="Password"]').send_keys('123')

I've tried passing multiple options and even used the WebDriverWait function, even tried Firefox and Safari, but nothing seems to work.

Is it possible that the website has some kind of security feature that doesn't allow automated scripts? If so, is there a way to bypass it?


Solution

  • You are using not unique locators. There are 3 elements matching //*[@id="UserName"] and //*[@id="Password"] locators.
    Locators should be always unique. In this case you need to take in account the unique parent element to make locators unique.
    The following code works:

    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:\webdrivers\chromedriver.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')
    

    The result screenshot is:

    enter image description here