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

oxf4rvwz  于 2022-11-24  发布在  Python
关注(0)|答案(4)|浏览(232)

我有一个将值写入网页的脚本,除了一个字段不断抛出以下错误外,所有值都写入:x1c 0d1x(截图提供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值作为string输入,WebDriver就会抛出错误。但是我的页面需要一个数字值。我被卡住了。
我在谷歌上搜索了一下,没有找到一个有用的答案。如果你使用Java,似乎有一个setAttribute方法可以使用,但如果你使用Python,你必须找出一些东西。
例如,问题here看起来很有希望,但我找不到String,也找不到如何导入它来使它工作。还有其他几个更老的问题讨论执行java,但我没有运气让它们工作。
这里有页面源代码HTML:https://drive.google.com/open?id=1xRNPfc5E65dbif_44BQ_z_4fMYVJNPcs

pdtvr36n

pdtvr36n1#

我敢肯定,虽然您传递的是值.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()

**屏幕截图:**x1c 0d1x

因此,我们必须检查js/方法实现了什么来验证字段中输入的值。正如你所看到的,从python脚本中传递带引号的整数对字段及其数据类型没有任何影响。

pcrecxhr

pcrecxhr2#

我肯定这是一个不受欢迎的答案,但这是我如何得到它的工作。
这个问题中的字段和同一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

我正在寻找一个高科技的答案时,一个低科技的工作周围足够。
我会写在简历上的是代码还是方法论?可能不会。它起作用了吗?我能接受吗?是的。谢谢那些试图回答的人。

j8yoct9x

j8yoct9x3#

这看起来很像逗号和圆点的问题?
但我也可能错了。
这取决于运行Selenium的计算机的浏览器区域设置。
因此,一个简单的测试可以是在字段中输入文本“2,78”或“2.78”。
Python将数字转换为字符串,而不是本地化的数字。当它作为键发送时,它将作为四个字符“2”“.”“7”“8”发送。然后它将在浏览器的Javascript范围内结束,根据操作系统和语言设置,将使用逗号或圆点作为小数分隔符。

nfeuvbwi

nfeuvbwi4#

包含通知的对话框

可能是Constraint API的element.setCustomValidity()方法的结果。
我已经通过了你分享的page-source HTML。但是根据你的代码试验:

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

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

  • 在处理<input>标记时,应使用element_to_be_clickable()而不是presence_of_element_located()
  • 你还没有告诉我们如果你没有以字符串的形式输入2.78值,WebDriver会抛出错误。不过,由于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处理html5约束验证弹出窗口?
  • 如何使用Selenium和Java提取www.example.com网站中HTML5约束验证的文本https://www.phptravels.net/?

相关问题