Python Request_html отправить форму, нажав кнопку с помощью JQuery

Я изучаю Kenneth Reitz's request_html и пытаюсь отправить форму визуализированной веб-страницы JS с помощью Jquery. Я не уверен, как это сделать, но вот моя попытка:

from requests_html import HTMLSession
url = "https://example.com"
session = HTMLSession()
r = session.get(url)
r.html.render()
script = """
       () => {
         $("#some_input_field").val("Some value");
         $("#submit_button").click();
         }
         """
r.html.render(script=script, reload=False)

Но значение не устанавливается в поле ввода и оно не отправляет форму... Есть ли способ имитировать нажатие кнопки или отправку формы через xhr в request_html?

Например: если мы используем селен, мы можем довольно легко смоделировать нажатие кнопки, набрав:

element.click()

2 ответа

Хорошо, в моем случае работает следующий код:

from requests_html import HTMLSession
url = "https://example.com"
session = HTMLSession()
r = session.get(url)
r.html.render()
script = """
       () => {
              if ( jQuery.isReady ) {  
                   $("#some_input_field").val("Some value");
                   $("#submit_button").click();
              }
        }
         """
r.html.render(script=script, reload=False)

РЕДАКТИРОВАТЬ: лучший подход должен быть:

from requests_html import HTMLSession
url = "https://example.com"
session = HTMLSession()
r = session.get(url)
r.html.render()
script = """
       () => {
              $(document).ready(function() {  
                   $("#some_input_field").val("Some value");
                   $("#submit_button").click();
              })
        }
         """
r.html.render(script=script, reload=False)

Приведенные ниже утверждения не были сделаны мной, но помогли решить проблему. Спасибо ответу alairjunior по этому вопросу .

Я не смог использовать события load и DOMContentLoaded. Пока не исследовал почему. Я подозреваю, что скрипт запускается с помощью «консоли», поэтому он не может получить эти события. Но это всего лишь дикая догадка.

Для быстрого и грязного решения я смог использовать setTimeout:

      script = """
() => {
setTimeout(function(){
    document.querySelectorAll("a")[2].click();
}, 3000);
}
"""

Если я используюr.html.render(sleep=10,script=script)Я могу получить содержимое страницы после выполнения клика.

Надеюсь, это полезно.

Другие вопросы по тегам