簡體   English   中英

Selenium 無法找到 html 元素,即使它是可見的

[英]Selenium fails finding html element even though its visible

我想用 python 編寫一個 selenium 腳本,它可以在測試框中寫入一個輸入,但 selenium 找不到該元素。 (而且我知道 scipt 現在看起來很糟糕,但請只關注錯誤)


from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

link = "https://kahoot.it/"
name = input("Name: ")
pin = str(input("PIN: "))
bots = int(input("Bots: "))

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)

for i in range(bots):
time.sleep(1)
driver.execute_script('''window.open("https://kahoot.it/%22,%22_blank");''')
wait1 = wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div\[1\]/div\[1\]/div/div/div/div\[3\]/div\[2\]/main/div/form/input")))
inputid = driver.find_element(By.NAME, 'game-Id')
inputid.send_keys(pin)
inputid.send_keys(Keys.ENTER)
time.sleep(5)

這是控制台輸出:


Traceback (most recent call last):
File "c:\\Users\\Blackbird\\Documents\\programmieren\\kahootjoinbot\\main.py", line 19, in \<module\>
wait1 = wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div\[1\]/div\[1\]/div/div/div/div\[3\]/div\[2\]/main/div/form/input")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\\Python311\\Lib\\site-packages\\selenium\\webdriver\\support\\wait.py", line 95, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

我嘗試了一些其他的方法,比如通過名稱或 ID 或 css 選擇器查找元素,但都沒有用。

有了這個應該工作:

from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

name = input("Name: ")
pin = str(input("PIN: "))
bots = int(input("Bots: "))

driver = webdriver.Chrome()

for i in range(bots):
    driver.execute_script('''window.open("https://kahoot.it/%22,%22_blank");''')
    driver.switch_to.window(driver.window_handles[i+1])
    wait = WebDriverWait(driver, 10)
    input = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[@name='gameId']")))
    input.send_keys(name)
    input.send_keys(Keys.ENTER)
    time.sleep(5)

為什么你的代碼不起作用? 因為您正在使用行driver.execute_script('''window.open("https://kahoot.it/%22,%22_blank");''')

該行打開一個新選項卡,然后當您執行下一行時wait1 = wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div\[1\]/div\[1\]/div/div/div/div\[3\]/div\[2\]/main/div/form/input")))您正在使用第一個選項卡,但您在第二個選項卡中導航。

因此,您正在打開第二個選項卡並嘗試在您的第一個選項卡中找到您的元素,這就是為什么您嘗試在第一個選項卡中查找什么元素並不重要,因為您的第一個選項卡不包含任何內容。

如何解決? 使用driver.get("https://kahoot.it/")在您的第一個選項卡中導航

或者您可以使用以下方法切換到新選項卡: driver.switch_to.window(driver.window_handles[i+1])其中[i+1]是您擁有的選項卡的索引。 所以第一個選項卡是 0 第二個是 1 等等。

忠告:

  • 不要使用完整的 xpath,當頁面發生變化時,你的 xpath 可能不再有效
  • 您可以像我一樣等待元素並保存在變量中,然后將其用於發送鍵、單擊等。

暫無
暫無

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

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