簡體   English   中英

selenium.common.exceptions.NoSuchElementException:消息:沒有這樣的元素:無法找到元素:

[英]selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:

我正在嘗試編寫一個 python 腳本,該腳本使用多個帳戶登錄 Kahoot。 我遇到了以下問題:我嘗試使用 Selenium 找到“Enter”按鈕並單擊它。 但是我收到了這條消息: selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".enter-button__EnterButton-sc-1o9b9va-0 gSoXKU"} (Session info: chrome=83.0.4103.116)我不知道為什么它不起作用。 這是我的代碼:

from selenium import webdriver

class kahoot_tab:
    def __init__(self):
        self.driver = webdriver.Chrome(r'C:\Users\...\chromedriver.exe')
        self.driver.get('https://kahoot.it/')

    def enter_pin(self, pin):
        self.driver.find_element_by_name('gameId').send_keys(pin)
        self.driver.find_element_by_class_name('enter-button__EnterButton-sc-1o9b9va-0 gSoXKU').click()

tab1 = kahoot_tab()
tab1.enter_pin('123456')

讓我感到沮喪的是這個元素的存在,因為這是 HTML 代碼: <button type="submit" value="Submit" class="enter-button__EnterButton-sc-1o9b9va-0 gSoXKU" data-functional-selector="join-game-pin"><span>Enter</span></button>

請幫我!

PS:我也在發送密碼和單擊按鈕之間使用time.sleep(100)進行了嘗試。

您可以嘗試使用輸入按鈕的完整 XPath,而不是使用其 class 名稱來選擇它。 話雖如此,您的代碼應該是:

from selenium import webdriver

class kahoot_tab:
    def __init__(self):
        self.driver = webdriver.Chrome(r'C:\Users\...\chromedriver.exe')
        self.driver.get('https://kahoot.it/')

    def enter_pin(self, pin):
        self.driver.find_element_by_name('gameId').send_keys(pin)
        self.driver.find_element_by_xpath('/html/body/div/div/div/div/main/div/form/button').click()

tab1 = kahoot_tab()
tab1.enter_pin('123456')

另一件事是使用WebDriverWait。 例如:

enter_button = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div/div/div/div/main/div/form/button")))

通過使用它,您正在等待元素完全加載,然后再按下它。

您的目標元素具有多個 class 名稱。

enter-button__EnterButton-sc-1o9b9va-0gSoXKU

使用.find_element_by_class_name無法實現,因為此方法僅適用於單個 class 名稱。

相反,對於多個 class 名稱,您可以將.find_element_by_css_selector與此值一起使用.enter-button__EnterButton-sc-1o9b9va-0.gSoXKU

self.driver.find_element_by_css_selector('.enter-button__EnterButton-sc-1o9b9va-0.gSoXKU').click()

CSS 選擇器參考

這是不依賴於元素類或完整 XPATH 的替代方案

from selenium.webdriver.common.by import By
...
enter_button = driver.find_element(By.XPATH, "//button[contains(span, 'Enter')]")
enter_button.click()

您應該利用 Selenium 的WebDriverWait來確保在嘗試send_keys()之前gameId是可見的。

暫無
暫無

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

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