Как ввести значение цифры c в поле ввода, используя Python Селен? - PullRequest
1 голос
/ 23 марта 2020

У меня есть скрипт, записывающий значения на веб-страницу, и все значения записываются, кроме одного поля, которое выдает следующее сообщение об ошибке: enter image description here (Скриншот предоставлен b / c в на другие подобные вопросы многие комментаторы ответили, что это невозможно на веб-странице.) «Пожалуйста, введите значение цифры 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, выдается ошибка. Но моя страница требует числового значения c. Я застрял.

Я погуглил и не нашел подходящего ответа на этот вопрос. Кажется, если вы используете Java, есть способ setAttribute, который вы можете использовать, но если вы используете Python, вам нужно что-то выяснить.

Например, вопрос здесь выглядело многообещающе, но я не мог найти String или как импортировать его, чтобы заставить его работать. Есть пара других более старых вопросов, в которых говорится о выполнении java, но мне не повезло заставить их работать.

У меня есть источник страницы HTML здесь: https://drive.google.com/open?id=1xRNPfc5E65dbif_44BQ_z_4fMYVJNPcs

Ответы [ 4 ]

2 голосов
/ 26 марта 2020

Я уверен, что хотя вы передаете значение .send_keys('2.78'), оно все равно будет иметь значение c. Таким образом, в идеале вы не должны получать эту проблему.

Вот пример 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()

Снимок экрана: enter image description here

Итак, мы должны проверить, что реализовал метод js / для проверки значения, введенного в поле. Как видите, передача целого числа в кавычках из скрипта python не имеет никакого значения для поля и его типа данных.

1 голос
/ 01 апреля 2020

Я уверен, что это будет непопулярным ответом, но я так и сделал.

Поле в этом вопросе и другое поле на другой странице в той же системе 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

Я искал высокотехнологичный ответ, когда не хватало низкотехнологичной работы вокруг.

Это код или методология, которую я бы написал в резюме о работе? Возможно нет. Это сработало и могу ли я жить с этим? Да. Спасибо за людей, которые пытались ответить.

1 голос
/ 30 марта 2020

Это выглядит как проблема запятой или точки?

Но я могу ошибаться.

Это зависит от локали браузера на компьютере, на котором работает ваш селен.

Таким образом, простой тест может состоять в том, чтобы ввести текст «2,78» или «2,78» в поле.

Python преобразует число в строку, а это не локализованный номер. Когда он отправляется в виде ключей, он отправляется в виде четырех символов «2». «7» «8». Затем он заканчивается в области видимости Javascript вашего браузера, что в зависимости от настроек ОС и языка будет использоваться запятая или точка в качестве десятичного разделителя.

0 голосов
/ 30 марта 2020

Диалоговое окно с уведомлением

notification

, возможно, является результатом метода ограничения API element.setCustomValidity().


Я прошел через страницу-источник HTML, которой вы поделились. Но в соответствии с вашими испытаниями кода:

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

Я не нашел ни одного тега <input> в источнике страниц. Текст на основе HTML помог бы нам лучше составить ответ. Однако вам нужно учесть несколько вещей следующим образом:

  • Поскольку вы имеете дело с тегом <input>, вместо presence_of_element_located() вы должны использовать element_to_be_clickable().
  • Эффективно ваша строка кода будет:

    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 в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...