【问题标题】:How can I define send_keys for python function?如何为 python 函数定义 send_keys?
【发布时间】:2019-11-03 06:36:12
【问题描述】:

我需要有关如何调用 send_keys 进行用户输入的建议。如果我为self.browser.find_elements_by_id ("Login1_UserName") 行分配一个变量,然后将其发送到send_keys,则该解决方案不起作用。我做错了什么?

 def login(Self):
     # login to the app
     username = self.browser.find_elements_by_id ("Login1_UserName")
     username.send_keys ("userone")

【问题讨论】:

  • 错误信息是什么?

标签: python selenium selenium-webdriver webdriver webdriverwait


【解决方案1】:

find_elements_* 将返回一个 List,而您不能在 List 上调用 send_keys()。所以你需要将find_elements_*替换为find_element_*,你可以使用下面的Locator Strategies

def login(Self):
    # login to the app
    self.browser.find_element_by_id("Login1_UserName").send_keys("userone")

根据最佳实践,在调用send_keys() 时,您需要为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下任一解决方案:

  • 使用ID:

    WebDriverWait(self.browser, 20).until(EC.element_to_be_clickable((By.ID, "Login1_UserName"))).send_keys("Tomasito")
    
  • 使用CSS_SELECTOR

    WebDriverWait(self.browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#Login1_UserName"))).send_keys("Tomasito")
    
  • 使用XPATH

    WebDriverWait(self.browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='Login1_UserName']"))).send_keys("Tomasito")
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

【讨论】:

  • 好的,谢谢。它非常有用。我有两个功能:def testTitle(self): self.browser.get("http://localhost/test") self.assertEqual("Login",self.browser.title) WebDriverWait(self.browser, 20).until(EC.element_to_be_clickable((By.ID, "Login1_UserName"))).send_keys( "Tomasito")def Login(self): # login to app self.browser.find_element_by_id("Login1_UserName").send_keys("userone") 只有当这条线在函数 testTitle 中而不是在我新创建的用于单独记录的登录函数中时才有效。
  • @Tomasito 你在使用 Python 的 unit-test 模块吗?
  • 对于python-unittest,请参阅thisthisthis 讨论。
  • @Tomasito 如果我的answer满足了您的question,请点击空心处Acceptanswer我的 answer 旁边的复选标记位于 votedown 箭头下方,因此复选标记变为 绿色
【解决方案2】:

这是因为您使用了find_elements_by_id("Login1_UserName"),它将返回列表而不是元素。您应该使用find_element_by_id("Login1_UserName")

def login(Self):
     # login to the app
     username = self.browser.find_element_by_id("Login1_UserName")
     username.send_keys("userone")

试试这个代码看看是否可行。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver=webdriver.Chrome("path of chrome driver")
driver.get('url')
username=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.ID,'Login1_UserName')))
username.send_keys("userone")

【讨论】:

  • 谢谢,但它不起作用......测试运行,但它甚至没有写一个字符。
  • 我没有收到任何错误,整个测试用完了,但它没有在用户名字段中写任何东西。
  • 这是因为你需要提供一些等待时间WebDriverWait
  • 这可能是因为 self.browser.get 的定义我在另一个函数中?因为如果你把这个命令移到那里,它就会完成。
猜你喜欢
  • 1970-01-01
  • 2020-02-21
  • 2016-09-06
  • 2019-11-18
  • 2021-02-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多