如果输入类型=“数字”,Selenium send_keys 不起作用

问题描述 投票:0回答:7

我正在使用硒编写测试。在这些测试中,我需要在表单的字段中输入数字。

这是 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

python firefox selenium selenium-webdriver
7个回答
6
投票

因为您使用的是 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

另请参阅:Selenium 找不到类型为 number 的字段


5
投票

我使用的是 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


2
投票

今天早上我遇到了这个问题。升级Selenium后,现在可以正常工作了。

所以如果你正在读这篇文章,请运行

pip install -U selenium

然后再试一次。我从 Selenium 版本 2.41.0 升级到 2.42.1,现在它可以在 Firefox 30.0 上正常工作。


0
投票

您或许可以使用 Javascript 来解决这个问题。以下代码是用 Java 编写的,但在 Python 中也可以类似地完成:

((IJavaScriptExecutor)webdriver)
     .ExecuteScript("document.getElementById('field_id').value='12';");

我遇到了同样的问题,使用 Javascript 解决了它。


0
投票

在我的例子中,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`

它是网络https://pypi.python.org/pypi/selenium


0
投票

我是这样解决这个问题的:

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)

0
投票

就我而言,我正在开发 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)
© www.soinside.com 2019 - 2024. All rights reserved.