繁体   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