我正在尝试编写一个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)
。
答案 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()
答案 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()
可见。