[英]What am I doing wrong using functions with selenium?
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# define path of driver
driver = webdriver.Chrome()
def mainloop():
driver.get("https://www.nitrotype.com/login")
login(username, password)
# LOGGING IN
def login(username, password):
time.sleep(2)
username = driver.find_element_by_id('username')
username.send_keys(username)
time.sleep(1)
password = driver.find_element_by_id('password')
username.send_keys(username)
time.sleep(1)
password.send_keys(password, Keys.RETURN)
mainloop()
當我運行它時,它顯示了我
Traceback (most recent call last):
File "/home/stevek/Projects/Python/nitrotype-bot/main.py", line 25, in <module>
mainloop()
File "/home/stevek/Projects/Python/nitrotype-bot/main.py", line 10, in mainloop
login(username, password)
File "/home/stevek/Projects/Python/nitrotype-bot/main.py", line 17, in login
username.send_keys(username)
File "/home/stevek/.local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 478, in send_keys
{'text': "".join(keys_to_typing(value)),
File "/home/stevek/.local/lib/python3.9/site-packages/selenium/webdriver/common/utils.py", line 150, in keys_to_typing
for i in range(len(val)):
TypeError: object of type 'WebElement' has no len()
我很混亂。 我沒有使用任何 XPath。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://www.nitrotype.com/login")
username = driver.find_element_by_id('username')
password = driver.find_element_by_id('password')
username.send_keys(username)
password.send_keys(password, Keys.RETURN)
當我不使用像這樣的函數時,它會按預期運行。 它登錄。 沒有功能。 怎么了? 另外,請注意我用變量替換了所有用戶名。
您將變量名稱傳遞到login()
中,該名稱與您為 function 中的 web 元素定義的變量具有相同的名稱。 你不能那樣做。
將它們更改為不同的東西,例如下面的user
和pw
def mainloop():
driver.get("https://www.nitrotype.com/login")
login("test", "testPW")
# LOGGING IN
def login(user, pw):
time.sleep(2)
username = driver.find_element_by_id('username')
username.send_keys(user)
time.sleep(1)
password = driver.find_element_by_id('password')
time.sleep(1)
password.send_keys(pw, Keys.RETURN)
mainloop()
我還刪除了 function 中重復的username.send_keys(user)
問題是您正在使用 WebElement 覆蓋傳遞給方法的username
參數,然后將其傳遞給.send_keys()
,它需要一個字符串。
def login(username, password):
^ username parameter is a string
username = driver.find_element_by_id('username')
^ username is overwritten with a WebElement here
在您的方法中,您不需要將元素分配給變量。 整個方法可以簡化為兩行,
def login(username, password):
driver.find_element_by_id('username').send_keys(username)
driver.find_element_by_id('password').send_keys(username, Keys.RETURN)
我還刪除了所有的睡眠,因為它們可能不需要。 需要等待時的最佳做法是使用WebDriverWait 。
此外,由於同樣的原因,沒有方法的最終代碼也無法工作。
username = driver.find_element_by_id('username')
^ this is a WebElement
username.send_keys(username)
^ this is a WebElement
^ this is a WebElement but should be a string.
您可能對.send_keys()
字符串進行了硬編碼,但在“用變量替換所有用戶名”時替換了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.