我有一个应用程序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())的结果分配给变量。
alert(this.responseText)
return this.responseText
return this.response
这是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);};处理结果。
result
false
xhr.open(..)
true
xhr.onload = function({alert(this.responseText);};
注意:如果需要将字符串参数传递给javascript,请确保始终使用来转义它们json.dumps(myString),否则当字符串包含单引号或双引号或其他棘手的字符时,js将会中断。
json.dumps(myString)