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

时间:2012-05-08 07:27:41

标签: forms testing post selenium request

我有一个应用程序A应该处理使用POST方法提交的表单。启动请求的实际表单是完全独立的应用程序B.我正在使用Selenium测试应用程序A,我喜欢为表单提交处理编写一个测试用例。

怎么做?这可以在Selenium完成吗?应用程序A没有可以发起此请求的表单。

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

3 个答案:

答案 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