【问题标题】:What am I doing wrong using functions with selenium?使用带有硒的功能我做错了什么?
【发布时间】:2021-05-11 02:32:36
【问题描述】:
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)

当我不使用像这样的函数时,它会按预期运行。它登录。没有功能。 怎么了? 另外,请注意我用变量替换了所有用户名。

【问题讨论】:

  • 在继续之前,我想说一件事。如果您正在尝试创建一个为您进行打字比赛的机器人,我可以向您保证,您将被禁止。我可以这么说,因为我自己也试过这个。我什至将wpm 设置为 65,我认为这是平均水平,但仍然被禁止。小心航行,我的家伙。
  • 堆栈跟踪错误消息引用了这行代码:for i in range(len(val)):,您向我们展示的代码中不存在该代码,因此我们很难提供帮助。另外,您正在将 send_keysusername 两次
  • @JD2775 如果您查看上面的行,它会告诉您它来自哪里 - site-packages 中的一个文件,这意味着它是 Selenium 的一部分,而不是用户的代码。
  • @MattDMo。啊,我的错。谢谢
  • @BuddyBob 只需使用 pyautogui。

标签: python selenium selenium-webdriver automation


【解决方案1】:

您将变量名称传递给login(),该变量名称与您为该函数中的网络元素定义的变量名称相同。你不能那样做。

将它们更改为不同的内容,例如下面的 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()

我还删除了函数中重复的username.send_keys(user)

【讨论】:

    【解决方案2】:

    问题是您正在用 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() 字符串,但在“用变量替换所有用户名”时替换了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-01
      • 2013-10-21
      • 2023-01-26
      • 2019-08-25
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2014-02-27
      相关资源
      最近更新 更多