проблема сохранения / отправки веб-формы с использованием селена и python - PullRequest
0 голосов
/ 04 марта 2020

Мне не удается в течение нескольких дней сохранить форму после заполнения всех полей. Я могу нажать на кнопку Сохранить, но ничего не происходит. Страница остается как есть, и не показывает ничего сохраненного и без ошибок при запуске сценария.

Вот выдержка из HTML веб-сайта (Это веб-сайт intr anet, поэтому недоступен в публикацию c) и извлечение кода python, который я собрал.

Я протестировал несколько разных способов отправки (xx.click (), xx.submit (), execute_script () et c ...) безрезультатно. Я также пытался вызвать javascript вместо нажатия на кнопку, но это тоже не сработало. Любая помощь будет принята с благодарностью.

  • Здесь HTML выдержка из веб-страницы:

<INPUT onclick=clearDirty();javascript:saveForm(); class=button type=button 
     value=Save> 

  • и вот скрипт Python, который я пытаюсь использовать без успеха:

    saving = driver.find_element_by_xpath ('//input[@value = "Save"]')
    saving.click()


Я также проверил выполнение JS через селен. Это приводит к трассировке «undefined не является конструктором», моя кнопка не нажата или моя форма не сохранена:


Saving = driver.find_element_by_xpath('//input[@value = "Save"]')

driver.execute_script("arguments[0].click();", Saving)

, а затем я проверил это, думая, что JS, возможно, хотел перезагрузить страницу я был включен и, возможно, захочу что-то «вернуть». Это приводит к трассировке «undefined не является конструктором», моя кнопка не нажата или моя форма не сохранена:


nextpage = driver.execute_script("return arguments[0].click();", Saving)
print ("NEXTPAGE:", nextpage, type(nextpage))

1 Ответ

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

У вас есть 2 функции в атрибуте onclick вашей кнопки сохранения. Первый clearDirty() не определен. Это приводит к тому, что интерпретатор js немедленно останавливается при этой ошибке и не продолжает выполнение второй функции saveForm().

Короткая заглушка может быстро обойти: function clearDirty() { }.

Я бы рекомендовал поместить определение вашей функции saveForm() плюс заглушку clearDirty() между тегами script , например:

<script>
  function saveForm() {
    ...
  }

  function clearDirty() { }
</script>

Если вы это сделаете, вы сможете увидеть, как ваш saveForm() будет вызван. Но есть и другие проблемы, см. Ниже.

В качестве еще одного теста вы можете даже удалить функцию clearDirty(); из атрибута onclick вашей кнопки сохранения. Затем вы видите, что функция saveForm() вызывается правильно.

Форма отправляется в местоположение, указанное атрибутом действия. Если такого атрибута нет или его значение пустое, оно публикуется для себя. В вашем случае местоположение будет: OBS/financial_model_tp_labor_otc.htm.

Если вы используете функцию submit элемента с селеном, все кнопки формы будут пропущены, и сама форма будет немедленно отправлена ​​путем разрешения * 1028 формы * атрибут. Это должно работать в любое время, независимо от вашей кнопки и js конфигурации. Если нет, то с вашим сгенерированным html.

действительно что-то не так, я бы действительно предложил использовать html валидатор. Источник html выглядит как исходящий из очень устаревшего инструмента M $. Есть много всего в net. Я использовал W3 C сервис в качестве первого выстрела. Просто укажите свой локальный html -файл и нажмите check .

Помимо проблем с языком и кодировкой символов, отсутствуют закрывающие теги html, о которых сообщалось прямо в внизу инструмента.

И, пожалуйста, заключите в кавычки значения ваших атрибутов, в них есть специальные символы.

edit

Я предоставлю вам маленький образец. Сначала создайте 2 html файла следующим образом.

ta. html:

<!DOCTYPE html>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <style>
      .bkon {
        background-color: darkgreen !important;
      }
    </style>
  </head>

  <body style="font-family:helvetica;text-align:center">
    <div id="frmdiv" style="margin:2em;padding:2em;background-color:lightsalmon;border: solid grey .5em;border-radius:.5em">
      <p>
        Find the button below which gets the form posted away
      </p>
      <form action="succ.html" method="post">
        <input type="button" value="Save" onclick="clearDirty();btnclk()" />
      </form>
    </div>

    <script>
      function btnclk() {
        var dv = $("#frmdiv");
        if(! dv.hasClass("bkon")) {
          dv.addClass("bkon");
        }
        else {
          dv.removeClass("bkon");
        }
      }
    </script>
  </body>
</html>

su cc. html:

<!DOCTYPE html>
<html>
  <head>

  </head>

  <body style="font-family:helvetica">
    <div style="font-size:2em;background-color:lightgreen;text-align:center;margin-top:2em;padding:.5em;">
      <p>
        you got the form submitted successfully
      </p>
    </div>
    <p>
      <a href="ta.html">go back</a>
    </p>
  </body>
</html>

Затем Вы можете пройти тест на селен, например:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("file:///path/to/test/your/ta.html")
btn = driver.find_element_by_xpath('//input[@value = "Save"]')
time.sleep(2)
btn.click()
time.sleep(2)
btn.submit()

В тесте я использую кнопку формы двумя способами. Во-первых, просто вызывая функцию нажатия кнопки, которая эквивалентна щелчку мышью. Во-вторых, используя функцию отправки.

Я намеренно добавил вашу подозрительную функцию clearDirty() в атрибут кнопки onclick, чтобы показать вам, что щелчок селена не удался, но отправка прошла. Удалите функцию clearDirty() из атрибута onclick, и вы увидите, что к тому времени срабатывает даже щелчок, который также можно проверить щелчком мыши вручную.

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