我在Windows 7中使用带有Python(https://pypi.python.org/pypi/selenium)的selenium包。当我尝试登录我的facebook帐户时,我使用send_keys
命令,例如
elem = browser.find_element_by_name("email")
elem.send_keys(email);
elem = browser.find_element_by_name("pass")
elem.send_keys(password);
登录失败显然是因为第二个send_keys
删除了密码的第一个字符(我通过直接将密码字符发送到电子邮件字段找到了这个。
这是怎么回事?为什么selenium不能像将密钥发送到输入字段那样简单?这是一种由Facebook编码的拒绝自动脚本的保护措施吗?
试图发送整个字母表得到这个:
abcdefghijklmnopqrstuvwxyzBCDFGIKLNOQSTWX
注意缺少多少个字符......
显然这个问题与facebook无关,而与Chrome驱动程序无关。
如果我发送以下简单代码
browser = webdriver.Chrome()
browser.get("https://www.google.com") # Load page
elem = browser.find_element_by_name("q") # Find the query box
query= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
elem.send_keys(query)
使用chrome驱动程序,我得到BCDFGIKLNOQSTWX注意A,E,H ... Y,Z是如何丢失使用firefox驱动程序(用browser = webdriver.Chrome()
替换browser = webdriver.Firefox()
我得到:ABCDEFGHIJKLMNOPQRSTUVWXYZ
看起来Chrome webdriver中有一些错误:https://code.google.com/p/chromedriver/issues/detail?id=435
当键盘配置为非英语语言,或者webdriver进程和chrome显示器在不同语言/环境中运行时(例如,当从一个主机通过远程显示器到达时),问题的核心就是另一个等)
我已经解决了使用send_keys的自定义方法,它工作得更低但速度更快。
from selenium.webdriver.remote.webelement import WebElement
def send_keys(el: WebElement, keys: str):
for i in range(len(keys)):
el.send_keys(keys[i])
send_keys(el, keys)
在python中使用selenium Ide和导出测试用例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re
class Test1(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "https://www.facebook.com/"
self.verificationErrors = []
self.accept_next_alert = True
def test_1(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_id("email").clear()
driver.find_element_by_id("email").send_keys("username")
driver.find_element_by_id("pass").clear()
driver.find_element_by_id("pass").send_keys("password")
driver.find_element_by_id("u_0_b").click()
driver.find_element_by_xpath("//div[@id='u_ps_0_1_5']/div/div").click()
driver.find_element_by_link_text("1 Requests").click()
driver.find_element_by_id("globalContainer").click()
def is_element_present(self, how, what):
try: self.driver.find_element(by=how, value=what)
except NoSuchElementException, e: return False
return True
def is_alert_present(self):
try: self.driver.switch_to_alert()
except NoAlertPresentException, e: return False
return True
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to_alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()