一尘不染

在Selenium中发出POST请求而不填写表格?

selenium

我有一个应用程序A,应该处理用POST方法提交的表单。发起请求的实际表单位于完全独立的应用程序B中。我正在使用Selenium测试应用程序A,并且我想编写一个测试用例以进行表单提交处理。

这该怎么做?可以完全在Selenium中完成吗?应用程序A没有可以启动此请求的表单。

请注意,该请求必须使用POST,否则我可以只使用WebDriver.get(url)方法。


阅读 513

收藏
2020-06-26

共1个答案

一尘不染

使用selenium,您可以执行任意Javascript,包括以编程方式提交表单

使用Selenium Java最简单的JS执行:

if (driver instanceof JavascriptExecutor) {
    System.out.println(((JavascriptExecutor) driver).executeScript("prompt('enter text...');"));
}

使用Javascript,您可以创建POST请求,设置所需的参数和HTTP标头,然后提交。

var xhr = new XMLHttpRequest();
// false as 3rd argument will forces synchronous processing
xhr.open('POST', 'http://httpbin.org/post', false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send('login=test&password=test');
alert(xhr.response);

如果您需要传递给硒响应文本,则可以代替alert(this.responseText)使用return this.responseTextreturn this.responseexecute_script(python)(针对Java的executeScript())的结果分配给变量。

这是python的完整示例:

from selenium import webdriver

driver = webdriver.Chrome()

js = '''var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://httpbin.org/post', false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

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

result = driver.execute_script(js);

result如果js代码是同步的,它将包含JavaScript的返回值。设置false为第三个参数以xhr.open(..)强制请求同步。将第3个arg设置为true或忽略它会使请求异步,这将需要xhr.onload = function({alert(this.responseText);};处理结果。

注意:如果需要将字符串参数传递给javascript,请确保始终使用来转义它们json.dumps(myString),否则当字符串包含单引号或双引号或其他棘手的字符时,js将会中断。

2020-06-26