我有一个应用程序A应该处理使用POST方法提交的表单。启动请求的实际表单是完全独立的应用程序B.我正在使用Selenium测试应用程序A,我喜欢为表单提交处理编写一个测试用例。
怎么做?这可以在Selenium完成吗?应用程序A没有可以发起此请求的表单。
请注意,请求必须使用POST,否则我只能使用WebDriver.get(url)方法。
答案 0 :(得分:6)
使用selenium,您可以执行任意Javascript,包括programmatically submit a form。
使用Selenium Java执行最简单的JS:
if (driver instanceof JavascriptExecutor) {
((JavascriptExecutor) driver).executeScript("alert('hello world');");
}
使用Javascript,您可以创建POST请求,设置所需的参数和HTTP标头,然后提交。
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');
如果您需要将响应文本传递给selenium而不是alert(this.responseText)
使用return this.responseText
并将executeScript()的结果分配给java变量。
以下是python的完整示例:
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)
注意:如果您需要将字符串参数传递给javascript,请确保始终使用
json.dumps(myString)
来转义它们,否则当字符串包含单引号或双引号或其他棘手的字符时,js将会中断。
答案 1 :(得分:4)
我认为使用Selenium不可能。没有办法使用Web浏览器无中生有地创建POST请求,而Selenium通过操纵Web浏览器来工作。我建议您使用HTTP库来发送POST请求,并在Selenium测试旁边运行它。 (你使用什么语言/测试框架?)
答案 2 :(得分:1)
我找到的最简单的方法是仅出于提交POST请求的目的而制作一个中间页。让硒打开页面,提交表单,然后获取最终页面的来源。
from selenium import webdriver
html='<html><head><title>test</title></head><body><form action="yoursite.com/postlocation" method="post" id="formid"><input type="hidden" name="firstName" id="firstName" value="Bob"><input type="hidden" name="lastName" id="lastName" value="Boberson"><input type="submit" id="inputbox"></form></body></html>'
htmlfile='/tmp/temp.html'
try:
with open(htmlfile, "w") as text_file:
text_file.write(html)
except:
print('Unable to create temporary HTML file')
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Firefox()
driver.get('file://'+htmlfile)
driver.find_element_by_id('inputbox').click();
#wait for form to submit and finish loading page
wait = WebDriverWait(driver, 30)
response=driver.page_source