我正在使用硒编写测试。在这些测试中,我需要在表单的字段中输入数字。
这是 html:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<form>
<input type="number" id="field_id">
</form>
</body>
</html>
代码:
browser = webdriver.Firefox()
browser.get('file:///home/my_username/test.html')
field = browser.find_element_by_id('field_id')
field.send_keys('12') # NOTHING HAPPEN!
顺便说一句,如果我将字段的类型更改为“文本”,则完全没有问题。此外,
field.send_keys(Keys.UP)
工作得很好(但当我使用引导程序时不起作用)和field.clear()
一直工作,以及field.click()
。
硒版本:2.41.0 火狐版本:29.0
因为您使用的是 Firefox 29。请降级到 Firefox 28,这是 Selenium 2.41.0 支持的版本,请参阅 CHANGES 文件。否则你需要等待新的 Selenium 更新。
这是我在 Firefox 28 上测试过的内容:
from selenium import webdriver
DEMO_PAGE = '''
data:text/html,
<form><input type="number" id="field_id"></form>
'''
browser = webdriver.Firefox()
browser.get(DEMO_PAGE)
input_number = browser.find_element_by_id('field_id')
input_number.send_keys('12')
input_number_value = input_number.get_attribute('value')
print "input_number_value = " + input_number_value
我使用的是 Fedora(它不提供像 Firefox 这样的旧版本软件包),因此“降级 Firefox”有点无法回答。
幸运的是,一个非常相似的问题的答案暗示了一个更好的解决方案——设置“dom.forms.number”Firefox首选项以禁用对
input type="number"
的特殊处理。在Python中:
profile = webdriver.FirefoxProfile()
profile.set_preference("dom.forms.number", False)
browsers = webdriver.Firefox(profile)
使用 Firefox 29 和 Selenium 2.41.0
今天早上我遇到了这个问题。升级Selenium后,现在可以正常工作了。
所以如果你正在读这篇文章,请运行
pip install -U selenium
然后再试一次。我从 Selenium 版本 2.41.0 升级到 2.42.1,现在它可以在 Firefox 30.0 上正常工作。
您或许可以使用 Javascript 来解决这个问题。以下代码是用 Java 编写的,但在 Python 中也可以类似地完成:
((IJavaScriptExecutor)webdriver)
.ExecuteScript("document.getElementById('field_id').value='12';");
我遇到了同样的问题,使用 Javascript 解决了它。
在我的例子中,selenium Send_keys 以这种方式工作得很好。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('http://www.yahoo.com')
assert 'Yahoo' in browser.title
elem = browser.find_element_by_name('p') # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN)
browser.quit()enter code here`
我是这样解决这个问题的:
locator = <element xpath>
field = browser.find_element_by_xpath(to_unicode(**locator**,"utf-8"))
if(field != None):
field.send_keys(Keys.CONTROL + 'a')
field.send_keys(value)
就我而言,我正在开发 chromedriver。我有一张带有
input= number
的表格。不可能send_keys
,什么也不会发生。
我尝试过
driver.execute_script(f"arguments[0].value = '{text}';", element)
。
此解决方案写入了数字,但表单无法识别它。
我还尝试了另一种替代方案
pyautogui.typewrite(text)
,但它产生的结果与之前的解决方案相同。
所以我需要执行真正的键盘触摸,而不是通过selenium模拟键盘触摸。
很抱歉,必须安装 2 个库:
pynput
(需要evdev
)
起初,pip install 不起作用,所以我不得不执行以下命令:
sudo apt-get install build-essential
pip install evdev
pip install pynput
解决方案总览:
from pynput.keyboard import Key, Controller
text = "my text"
xpath = "//my//xpath"
self.wait.until(EC.element_to_be_clickable((By.XPATH, xpath))).click()
keyboard = Controller()
for char in text:
keyboard.press(char)
keyboard.release(char)