如何使用 Python Selenium 在输入字段中输入数值?

How to enter numeric value in input field using Python Selenium?

我有一个将值写入网页的脚本,除了一个不断抛出以下错误的字段外,所有值都被写入: (在其他类似问题中提供的屏幕截图 b/c 许多评论说这不可能发生在网页上。) "Please enter a numeric value."

这是我的代码:

workcenter_to_add = {}
workcenter_to_add['BatchCycle'] = str(2.78)
# driver = my_chrome_webpage
WebDriverWait(driver, wait_time).until(EC.presence_of_element_located((By.XPATH, "//input[@id='BatchSize']"))).send_keys(workcenter_to_add['BatchCycle'])

众所周知,如果我不输入 2.78 值作为 string WebDriver 就会抛出错误。但是我的页面需要一个数值。我卡住了。

我用 Google 搜索了一下,没有找到可用的答案。如果您使用的是 Java,似乎可以使用 setAttribute 方法,但如果您使用的是 Python,则必须想出办法。

例如,问题 here 看起来很有希望,但我找不到 String 或如何导入它以使其工作。还有其他几个更老的问题谈论执行 java 但我没有运气让他们工作。

我在此处获得了页面源 HTML: https://drive.google.com/open?id=1xRNPfc5E65dbif_44BQ_z_4fMYVJNPcs

我敢肯定,尽管您传递的是值 .send_keys('2.78'),但该值仍然是数字。所以,理想情况下你不应该遇到这个问题。

这是示例 html 和用于确认相同内容的脚本。

<html><head>

<script>
function validateOnClick(evt) {
  var theEvent = evt || window.event;
  // Handle paste
  if (theEvent.type === 'click') {
      key = document.querySelector('input').value.toString();
  } else {
  // Handle key press
      var key = theEvent.keyCode || theEvent.which;
      key = String.fromCharCode(key);
  }
  var regex = /[0-9]|\./;
console.log(key);
  if( !regex.test(key) ) {
    alert("Please enter numeric value");
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
  }
}
</script>
</head>

<body>
<input placeholder='check'></input>
<button type='submit' onClick='validateOnClick(event)'>Submit</button>
</body></html>

要检查的脚本:

driver.get(url)
# check with string (not integer)
driver.find_element_by_tag_name('input').send_keys('Hello')
driver.find_element_by_tag_name('button').click()
print(driver.switch_to.alert.text)
driver.switch_to.alert.dismiss()
# now check with integer
driver.find_element_by_tag_name('input').clear()
driver.find_element_by_tag_name('input').send_keys(workcenter_to_add['BatchCycle'])
driver.find_element_by_tag_name('button').click()

截图:

因此,我们必须检查 js/method 实施了什么以验证字段中输入的值。如您所见,从 python 脚本中用引号传递整数对字段及其数据类型没有任何影响。

带有通知的对话框

可能是Constraint API's element.setCustomValidity()方法的结果。


我已经完成了您分享的page-source HTML。但是根据您的代码试验:

By.XPATH, "//input[@id='BatchSize']"

我没有在页面源中找到任何 <input> 标记。基于文本的相关 HTML 会帮助我们以更好的方式构建答案。但是,您需要考虑以下几点:

  • 当您处理 <input> 标签时,您应该使用 element_to_be_clickable().
  • 而不是 presence_of_element_located()
  • 您还没有告诉我们如果您不输入 2.78 值作为字符串会抛出的错误 。不过,由于 str(2.78) 有效,所以您可以坚持下去。
  • 实际上你的代码行将是:

    workcenter_to_add = {}
    workcenter_to_add['BatchCycle'] = str(2.78)
    WebDriverWait(driver, wait_time).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='BatchSize']"))).send_keys(workcenter_to_add['BatchCycle'])   
    

参考资料

您可以在 Constraint_validation 中找到一些相关讨论:

看起来很像逗号对点的问题?

但我可能是错的。

这取决于您的 selenium 运行 所在机器的浏览器区域设置。

因此,一个简单的测试可能是在字段中输入文本“2,78”或“2.78”。

Python 将数字转换为字符串,这不是本地化数字。 当它作为密钥发送时,它作为四个字符“2”“.”发送。 '7' '8'。 然后它在浏览器的 Javascript 范围内结束,这取决于 OS 和语言设置将使用逗号或点作为小数点分隔符。

我确定这将是一个不受欢迎的答案,但这就是我的工作方式。

这个问题中的字段和同一 ERP 系统中另一个页面上的另一个字段抛出相同的错误。 send_keys() 无论我怎样尝试都不行。

那时我开始思考并开始尝试其他方法。

我尝试将信息输入页面上的另一个字段,该字段将通过 send_keys() 接受数字,然后将值剪切并粘贴到不接受我使用的值的字段中 send_keys() .成功了!

这是我在具有相同问题的不同页面上使用的代码片段:

                    elem1 = driver.find_element_by_id('txtNote')
                    elem1.send_keys(rm['txtGross_Weight'])
                    elem1.send_keys(Keys.CONTROL, 'a') #highlight all in box
                    elem1.send_keys(Keys.CONTROL, 'x') #cut
                    elem2 = driver.find_element_by_id('txtGross_Weight')
                    elem2.send_keys(Keys.CONTROL, 'v') #paste

我一直在寻找高科技的答案,但低科技的解决方案就足够了。

我会在工作简历上写代码或方法吗?可能不会。它有效吗?我可以忍受吗?是的。感谢那些试图回答的人。