1

我有一个脚本将值写入网页,并且所有值都写入,除了一个不断抛出以下错误的字段:( 在此处输入图像描述 屏幕截图在其他类似问题中提供了 b/c 许多评论说这不可能在网络上发生页。)“请输入一个数值。”

这是我的代码:

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值作为 astring WebDriver会引发错误。但是我的页面需要一个数值。我被困住了。

我用谷歌搜索并没有找到可用的答案。如果你正在使用,似乎Java有一种setAttribute方法可以使用,但如果你正在使用Python,你必须弄清楚一些事情。

例如,这里的问题看起来很有希望,但我找不到String或如何导入它以使其工作。还有一些其他更老的问题是关于执行的java,但我没有让它们发挥作用。

我在这里有页面源 HTML: https ://drive.google.com/open?id=1xRNPfc5E65dbif_44BQ_z_4fMYVJNPcs

4

4 回答 4

2

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

这是用于确认相同的示例 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/方法来验证字段中输入的值。正如您所看到的,从 python 脚本中传递带引号的整数对字段及其数据类型没有任何影响。

于 2020-03-26T16:43:47.943 回答
2

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

此问题中的字段和同一 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

当一个低技术的工作就足够了时,我正在寻找一个高科技的答案。

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

于 2020-04-01T19:04:29.003 回答
1

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

但我可能是错的。

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

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

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

于 2020-03-30T17:59:45.883 回答
0

带有通知的对话框

通知

可能是约束 APIelement.setCustomValidity()方法的结果。


我已经浏览了您共享的页面源 HTML 。但根据您的代码试验:

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

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

  • 当您处理<input>标签时,presence_of_element_located()应该使用element_to_be_clickable().
  • 如果您不将值作为字符串输入,您还没有告诉我们WebDriver引发的错误。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

于 2020-03-29T23:07:35.863 回答