Pergunta sobre testing, selenium, forms, request, post – Fazendo uma solicitação POST no Selenium sem preencher um formulário?

10

Eu tenho um aplicativo A que deve lidar com um formulário enviado com o método POST. O formulário atual, que inicia a solicitação, está em aplicativo totalmente separado B. Estou testando o aplicativo A usando o Selenium e gosto de escrever um caso de teste para o envio de formulário.

Como fazer isso? Isso pode ser feito em Selênio? O aplicativo A não possui um formulário que possa iniciar essa solicitação.

Note que o pedido deve usar POST, caso contrário eu poderia usar o método WebDriver.get (url).

@ Scott: Eu não terei acesso ao aplicativo B onde o formulário será. Juha Syrjälä
Eu acho que a forma de zombaria é o melhor caminho a percorrer. Você pode até criar este formulário dinamicamente com JavaScript neoascetic
Por que você não preenche o formulário com selênio e envia o formulário e garante que você receba os dados adequados após a conclusão da execução. No entanto, se o aplicativo B estiver inativo, esse teste sempre falhará - em outras palavras, acho que você precisa zombar dessa interação. Scott
parece que a única maneira de fazer isso é zombar do formulário dentro do aplicativo ao qual você tem acesso, caso contrário o selênio não faz mais sentido neste contexto. Scott
Duplicado destackoverflow.com/questions/5660956/… ? rwitzel

Sua resposta

2   a resposta
4

Eu não acho que isso seja possível usando o Selenium. Não há como criar uma solicitação POST a partir do nada usando um navegador da Web, e o Selenium funciona manipulando navegadores da web. Eu sugeriria que você usasse uma biblioteca HTTP para enviar a solicitação POST e executasse isso junto com seus testes do Selenium. (Qual estrutura de linguagem / teste você está usando?)

Java + JUnit. Eu posso fazer o pedido POST usando outras ferramentas, mas como posso fazer o Selenium processar a resposta? Juha Syrjälä
5

enviar programaticamente um formulário.

Execução JS mais simples com Selenium Java:

<code>if (driver instanceof JavascriptExecutor) {
    ((JavascriptExecutor) driver).executeScript("alert('hello world');");
}
</code>

e, com o Javascript, você pode criar uma solicitação POST, definir os parâmetros necessários e os cabeçalhos HTTP e enviá-los.

<code>var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://httpbin.org/post', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
    alert(this.responseText);
};

xhr.send('login=test&password=test');
</code>

Se você precisar passar para o selênio o texto de resposta, em vez dealert(this.responseText) usarreturn this.responseText e atribuir o resultado deexecuteScript () para uma variável java.

Aqui está um exemplo completo para python:

<code>from selenium import webdriver

driver = webdriver.Chrome()

js = '''var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://httpbin.org/post', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
    alert(this.responseText);
};

xhr.send('login=test&password=test');'''

driver.execute_script(js)
</code>

NOTA: Se você precisar passar argumentos de string para o javascript, certifique-se de sempre escapar deles usandojson.dumps(myString) ou então seu js irá quebrar quando a string contiver aspas simples ou duplas ou outros caracteres complicados.

Perguntas relacionadas