1

I'm trying to learn Selenium. The code below should open fastmail in Chrome and allow me to search for the specified web element.

I can get this to work in the Python interpreter by entering the code line by line.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.fastmail.com/login/")

username = driver.find_element(By.ID, 'v17-input')

However, when I try to run it as a full Python script I am unable to find the element I am looking for. The error message is below.

Traceback (most recent call last):
  File "C:\MyPythonScripts\test.py", line 9, in <module>
    username = driver.find_element(By.ID, 'v17-input')
  File "C:\Users\slong\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 856, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\slong\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 429, in execute
    self.error_handler.check_response(response)
  File "C:\Users\slong\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\errorhandler.py", line 243, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="v17-input"]"}
  (Session info: chrome=106.0.5249.119)
Stacktrace:
Backtrace:
    Ordinal0 [0x00801ED3+2236115]
    Ordinal0 [0x007992F1+1807089]
    Ordinal0 [0x006A66FD+812797]
    Ordinal0 [0x006D55DF+1005023]
    Ordinal0 [0x006D57CB+1005515]
    Ordinal0 [0x00707632+1209906]
    Ordinal0 [0x006F1AD4+1120980]
    Ordinal0 [0x007059E2+1202658]
    Ordinal0 [0x006F18A6+1120422]
    Ordinal0 [0x006CA73D+960317]
    Ordinal0 [0x006CB71F+964383]
    GetHandleVerifier [0x00AAE7E2+2743074]
    GetHandleVerifier [0x00AA08D4+2685972]
    GetHandleVerifier [0x00892BAA+532202]
    GetHandleVerifier [0x00891990+527568]
    Ordinal0 [0x007A080C+1837068]
    Ordinal0 [0x007A4CD8+1854680]
    Ordinal0 [0x007A4DC5+1854917]
    Ordinal0 [0x007AED64+1895780]
    BaseThreadInitThunk [0x76926739+25]
    RtlGetFullPathName_UEx [0x777A8FD2+1218]
    RtlGetFullPathName_UEx [0x777A8F9D+1165]

And I have not clue what it's about. The error message seems to imply that it is unable to locate the element.

Prophet
  • 32,350
  • 22
  • 54
  • 79
Shaye
  • 179
  • 13

1 Answers1

1

I see 2 problems here:

  1. You need to add a delay to wait for element's clickability. WebDriverWait expected_conditions is the right tool for this.
  2. You are using a wrong locator.

This code worked:

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(service=webdriver_service, options=options)
url = 'https://www.fastmail.com/login/'
driver.get(url)
wait = WebDriverWait(driver, 10)

username_field = wait.until(EC.element_to_be_clickable((By.ID, "v16-input")))
password_field = wait.until(EC.element_to_be_clickable((By.ID, "v17-input")))
Prophet
  • 32,350
  • 22
  • 54
  • 79
  • Excellent!! Thanks for this. I was tearing my hair out! I found some further documentation on ExpectedConditions too: https://www.lambdatest.com/blog/expected-conditions-in-selenium-examples/. One question though. In what situation would you then use the find_element locator since it is not useful in this particular scenario? – Shaye Oct 18 '22 at 09:48
  • When you searching for an element on a page while you totally, absolutely sure the page is now totally stable, already fully rendered etc. Not after navigating to it or after some click that may cause to the page to become changing. In real projects we always are looking for element to be clickable or visible and only after that clicking on that element, sending it a text etc. – Prophet Oct 18 '22 at 09:52