簡體   English   中英

嘗試使用 selenium 登錄我大學的網頁時,我不斷收到錯誤消息 NoSuchElementException

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

我對 python 和 StackOverflow 還很陌生,所以請耐心等待。 我正在嘗試用 python 編寫腳本並使用 selenium 將自己登錄到我大學的網站,但我一直收到相同的錯誤 NoSuchElementException。

錯誤的全文:

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)

我在一個名為 credential.py 的單獨腳本中包含我的登錄信息,我正在調用該腳本

from credentials import bb_username, bb_password

我的代碼

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')) 

錯誤出現在這里

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

會不會是 PATH 的問題?

您可能需要等待元素。 嘗試類似以下內容:

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)

Justin Ezequiel 說的是正確的。 您需要在代碼中添加等待頁面才能正確加載; 由於以下事實,取決於互聯網速度,某些頁面的加載速度比其他頁面快。 ( 明顯地 )

考慮到這一點,我能夠為您識別頁面上的elements 我也在代碼中添加了一些注釋。

主程序 - 供參考

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM