簡體   English   中英

使用 selenium 的函數我做錯了什么?

[英]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 元素定義的變量具有相同的名稱。 你不能那樣做。

將它們更改為不同的東西,例如下面的userpw

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.

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