當您專注于視窗 (Chrome) 時,該程式運行良好,但是當您切換到另一個視窗(如 Mozilla)或另一個應用程式以繼續作業時,Selenium 無法定位該元素。
無論我是否在其上打開其他應用程式,切換到其他視窗并順利登錄,它都應該完美地定位元素 - 這就是我想要完成的事情,所以當它沒有給我這個錯誤時,我可以把它變成無頭。
我也嘗試使用驅動程式等待但無濟于事。
我得到的錯誤:
selenium.common.exceptions.TimeoutException: Message:
Stacktrace:
Backtrace:
Ordinal0 [0x00986903 2517251]
Ordinal0 [0x0091F8E1 2095329]
Ordinal0 [0x00822848 1058888]
Ordinal0 [0x0084D448 1233992]
Ordinal0 [0x0084D63B 1234491]
Ordinal0 [0x00877812 1406994]
Ordinal0 [0x0086650A 1336586]
Ordinal0 [0x00875BBF 1399743]
Ordinal0 [0x0086639B 1336219]
Ordinal0 [0x008427A7 1189799]
Ordinal0 [0x00843609 1193481]
GetHandleVerifier [0x00B15904 1577972]
GetHandleVerifier [0x00BC0B97 2279047]
GetHandleVerifier [0x00A16D09 534521]
GetHandleVerifier [0x00A15DB9 530601]
Ordinal0 [0x00924FF9 2117625]
Ordinal0 [0x009298A8 2136232]
Ordinal0 [0x009299E2 2136546]
Ordinal0 [0x00933541 2176321]
BaseThreadInitThunk [0x770EFA29 25]
RtlGetAppContainerNamedObjectPath [0x77B47A9E 286]
RtlGetAppContainerNamedObjectPath [0x77B47A6E 238]
代碼:
import tkinter as tk
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import time
from time import sleep
root = tk.Tk()
app_width = 300
app_height = 320
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width / 2) - (app_width / 2)
y = (screen_height / 2) - (app_height / 2)
root.geometry(f'{app_width}x{app_height} {int(x)} {int(y)}')
testbtn_txt = tk.StringVar()
testbtn = tk.Button(root, textvariable=testbtn_txt, command=lambda:open_browser_func(), font="Arial", bg="#808080", fg="white", height=1, width=10)
testbtn_txt.set("Test")
testbtn.grid(row=10, column=0, columnspan=2, pady=5, padx=5)
def open_browser_func():
global driver
driver = webdriver.Chrome("C:\Program Files (x86)\chromedriver.exe")
driver.get("https://twitter.com/i/flow/login")
sleep(5)
loginuser = WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[5]/label/div/div[2]/div/input')))
loginuser.send_keys("Username")
sleep(5)
loginuser.send_keys(Keys.RETURN)
loginuser = WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[3]/div/label/div/div[2]/div[1]/input')))
loginuser.send_keys("Password")
sleep(5)
loginuser.send_keys(Keys.RETURN)
return driver
root.mainloop()
這真的很煩人,因為它有時起作用,有時不起作用。由于切換到其他行程時發生錯誤,我無法完全自動化。
uj5u.com熱心網友回復:
在跳轉到 XPath 之前,您應該使用以下任一定位器。
- ID
- 名稱
- 班級名稱
- 鏈接文本
- 部分鏈接文本
- 標簽名稱
- css 選擇器
- 路徑
另外,請確保您不應該使用absolute xpath,而應該使用relative xpath。
所以,而不是這些
loginuser = WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[5]/label/div/div[2]/div/input')))
loginuser.send_keys("Username")
sleep(5)
loginuser.send_keys(Keys.RETURN)
loginuser = WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[3]/div/label/div/div[2]/div[1]/input')))
loginuser.send_keys("Password")
sleep(5)
loginuser.send_keys(Keys.RETURN)
用這個:
wait = WebDriverWait(driver, 30)
loginuser = wait.until(EC.visibility_of_element_located((By.NAME, "text")))
loginuser.send_keys("Username", Keys.RETURN)
loginPassword = wait.until(EC.visibility_of_element_located((By.NAME, "password")))
loginPassword.send_keys("password here", Keys.RETURN)
uj5u.com熱心網友回復:
Selenium需要同時關注以下兩個方面:
- 瀏覽器視窗
- DOM元素
當您將另一個視窗(如 Mozilla 或另一個應用程式)帶到前臺并繼續作業時,Selenium 會失去對Browser Context的關注。因此,您會看到錯誤。
參考
您可以在以下位置找到一些相關的詳細討論:
- Selenium 在瀏覽器被手動中斷時停止
- 打開 Selenium 瀏覽器的方法不與我當前的瀏覽器重疊
- 如何在瀏覽器最小化時使用 selenium webdriver 執行測驗
- 使用 Python 將 selenium chrome 實體發送到后臺
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/393610.html
上一篇:如何檢測tkinterCanvas中單擊物件的標簽?
下一篇:tkinter番茄鐘的暫停和恢復
