我在向Google登录框中的用户名和密码字段发送密钥时遇到问题。 Selenium找到id为“Email”和“Passwd”的webelements,但是我无法向他们发送任何密钥。
这是没有产生预期结果的代码:
from selenium import webdriver
#from selenium.webdriver.common.keys import Keys
import time
username = "test"
password = "ninja"
driver = webdriver.Firefox()
driver.get(u'http://www.google.com')
driver.implicitly_wait(10)
elem = driver.find_element_by_id("gb_70")
elem.click()
username = driver.find_element_by_id('Email')
username.send_keys(username)
此代码生成错误:
追踪(最近一次通话): 文件“SERPkopi.py”,第18行,in username.send_keys(用户名) 在send_keys中输入文件“/Users/Sverdrup/virtualenv-1.6.1/Alert/lib/python2.7/site- packages / selenium / webdriver / remote / webelement.py”,第142行 local_file = LocalFileDetector.is_local_file(* value) 在is_local_file中输入文件“/xxxxx/xxxxxx/virtualenv-1.6.1/Alert/lib/python2.7/site- packages / selenium / webdriver / remote / webelement.py”,第253行 对于范围内的i(len(val)): TypeError:'WebElement'类型的对象没有len()
这很奇怪,因为相同的代码可以写入谷歌的'q'(查询)字段
我试图通过id,name,xpath来识别webElement,但无济于事。
背景为何:
我今天睁开眼睛看谷歌警报,并希望对我公司的客户名称设置警报(这是一个企业对企业的设置,因此客户就是公司本身)。客户相对较小,我不认为我会在他们的名字上收到很多警报,但能够跟踪它们会很棒。
看到没有用于谷歌警报的API,我想我会使用selenium以编程方式输入几百个客户名称。我首先必须能够登录我的帐户...
我真的很感激所有和任何帮助。
此致
答案 0 :(得分:9)
所以这可能是一个苦乐参半的答案,但你的脚本基本上没问题。这是问题所在:
username = "test"
#....
username = driver.find_element_by_id('Email')
username.send_keys(username)
你设置用户名就好了,但是你继续将它重新定义为Email
元素,然后由于最后一行而导致错误 - 你将username
元素发送回自身作为一个字符串(这是send_keys
的参数),导致类似Inception的混乱事件。 len
错误是因为Selenium试图将参数的长度设为send_keys
,它希望它是一个字符串,但在这种情况下是一个元素。要修复它,只需更改其中一个变量名称即可。例如
user_field = driver.find_element_by_id('Email')
user_field.send_keys(username)