在Selenium中发出POST请求而不填写表格?
我有一个应用程序A,应该处理用POST方法提交的表单。发起请求的实际表单位于完全独立的应用程序B中。我正在使用Selenium测试应用程序A,并且我想编写一个测试用例以进行表单提交处理。
这该怎么做?可以完全在Selenium中完成吗?应用程序A没有可以启动此请求的表单。
请注意,该请求必须使用POST,否则我可以只使用WebDriver.get(url)方法。
回答:
使用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.responseText或return
this.response将execute_script(python)(针对Java的executeScript())的结果分配给变量。
这是python的完整示例:
from selenium import webdriverdriver = 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将会中断。
以上是 在Selenium中发出POST请求而不填写表格? 的全部内容, 来源链接: utcz.com/qa/415447.html