简体   繁体   中英

I keep getting the error message NoSuchElementException when trying to use selenium to log into my university's webpage

I'm pretty new to python and StackOverflow so please bear with me. I'm trying to write a script in python and use selenium to log myself into my university's website but I keep getting the same error NoSuchElementException.

The full text of the error:

Exception has occurred: NoSuchElementException
Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="username"]"}
  (Session info: chrome=86.0.4240.183)
  File "C:\Users\User\Desktop\Python\Assignment6\nsuokSelenium.py", line 9, in <module>
    browser.find_element_by_id('username').send_keys(bb_username)

I have my log in information in a separate script called credential.py that I'm calling with

from credentials import bb_username, bb_password

My Code

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from credentials import bb_password, bb_username
browser = webdriver.Chrome()
browser.get('https://bb.nsuok.edu')
browser.find_element_by_id('username').send_keys(bb_username)
browser.find_element_by_id('password').send_keys(bb_password)
browser.find_element_by_name('submit').click()
try:
    WebDriverWait(browser, 1) .until(EC.url_matches('https://bb.nsuok.edu/ultra'))
except TimeoutError:
    print('took too long')
WebDriverWait(browser, 10).until(EC.url_matches('https://bb.nsuok.edu/ultra')) 
browser.find_element_by_name('Courses').click()
WebDriverWait(browser, 10).until(EC.url_matches('https://bb.nsuok.edu/ultra/course')) 
browser.find_element_by_name('Organizations').click()
WebDriverWait(browser, 10).until(EC.url_matches('https://bb.nsuok.edu/ultra/logout')) 

The error is showing up here

browser.find_element_by_id('username').send_keys(bb_username)

Could it be an issue with PATH?

You may need to wait for the element. Try something like the following:

element = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.ID, "username"))
    )
element.clear()
element.send_keys(bb_username)

element = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.ID, "password"))
    )
element.clear()
element.send_keys(bb_password)

What Justin Ezequiel said is correct. You need to add waits in your code for the page to load properly; due to the fact that, dependent upon internet speeds, some pages load faster than others. ( obviously )

With that in mind, I was able to identify the elements on the page for you. I added some comments in the code as well.

MAIN PROGRAM - For Reference

from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver as ChromeDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as DriverWait
from selenium.webdriver.support import expected_conditions as DriverConditions
from selenium.common.exceptions import WebDriverException


def get_chrome_driver():
    """This sets up our Chrome Driver and returns it as an object"""
    path_to_chrome = "F:\Selenium_Drivers\Windows_Chrome85_Driver\chromedriver.exe"
    chrome_options = webdriver.ChromeOptions() 
    
    # Browser is displayed in a custom window size
    chrome_options.add_argument("window-size=1500,1000")
    
    return webdriver.Chrome(executable_path = path_to_chrome,
                            options = chrome_options)

    
def wait_displayed(driver : ChromeDriver, xpath: str, int = 5):
        try:
            DriverWait(driver, int).until(
                DriverConditions.presence_of_element_located(locator = (By.XPATH, xpath))
            )
        except:
            raise WebDriverException(f'Timeout: Failed to find {xpath}')
  
        
def enter_information(driver : ChromeDriver, xpath: str, text : str):
    driver.find_element(By.XPATH, xpath).send_keys(text)
    if(driver.find_element(By.XPATH, xpath).get_attribute('value').__len__() != text.__len__()):
        raise Exception(f'Failed to populate our Textbox.\nXPATH: {xpath}')


# Gets our chrome driver and opens our site
chrome_driver = get_chrome_driver()
chrome_driver.get("https://logon.nsuok.edu/cas/login")

# Waits until our elements are loaded onto the page
wait_displayed(chrome_driver, "//form//input[@id='username']")
wait_displayed(chrome_driver, "//form//input[@id='password']")
wait_displayed(chrome_driver, "//form//input[contains(@class, 'btn-submit')]")

# Inputs our Username and Password
enter_information(chrome_driver, "//form//input[@id='username']", "MyUserNameHere")
enter_information(chrome_driver, "//form//input[@id='password']", "MyPasswordHere")

# Clicks Login
chrome_driver.find_element(By.XPATH, "//form//input[contains(@class, 'btn-submit')]").click()

chrome_driver.quit()
chrome_driver.service.stop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM