selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:

时间:2020-07-03 14:41:24

标签: python html python-3.x selenium

我正在尝试编写一个Python脚本,该脚本使用多个帐户登录到Kahoot。我遇到了以下问题:我试图用Selenium定位“输入”按钮,然后单击它。但我收到此消息: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>

请帮助我!

P.S .:在发送图钉和单击按钮之间,我还尝试了time.sleep(100)

3 个答案:

答案 0 :(得分:2)

您可以尝试使用回车按钮的完整XPath,而不用其类名进行选择。话虽如此,您的代码应为:

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

使用此功能,您正在等待元素完全加载,然后再按下它。

答案 1 :(得分:1)

您的目标元素具有多个类名。

enter-button__EnterButton-sc-1o9b9va-0 gSoXKU

您无法使用 .find_element_by_class_name ,因为此方法仅适用于单个类名。

相反,对于多个类名,可以将 .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 Selector Reference

答案 2 :(得分:1)

这是一种不依赖元素的类或完整XPATH的替代方法

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

在尝试使用gameId之前,应利用Selenium的WebDriverWait确保send_keys()可见。