Forms 在没有填写表格的情况下用Selenium发出POST请求?

Forms 在没有填写表格的情况下用Selenium发出POST请求?,forms,testing,post,selenium,request,Forms,Testing,Post,Selenium,Request,我有一个申请表A,它应该处理用POST方法提交的表格。发起请求的实际表单位于完全独立的应用程序B中。我正在使用Selenium测试应用程序A,我想为表单提交处理编写一个测试用例 如何做到这一点?用硒能做到这一点吗?应用程序A没有可以启动此请求的表单 请注意,请求必须使用POST,否则我只能使用WebDriver.get(url)方法。我认为使用Selenium不可能做到这一点。没有一种方法可以使用web浏览器从无到有地创建POST请求,而Selenium通过操纵web浏览器来工作。我建议您使用H

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

如何做到这一点?用硒能做到这一点吗?应用程序A没有可以启动此请求的表单


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

我认为使用Selenium不可能做到这一点。没有一种方法可以使用web浏览器从无到有地创建POST请求,而Selenium通过操纵web浏览器来工作。我建议您使用HTTP库来发送POST请求,并将其与Selenium测试一起运行。(您使用的是什么语言/测试框架?

使用selenium,您可以执行任意Javascript,包括

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

if(JavascriptExecutor的驱动程序实例){
System.out.println(((JavascriptExecutor)driver.executeScript(“提示符('enter text…');”));
}
使用Javascript,您可以创建POST请求,设置所需的参数和HTTP头,然后提交它

var xhr=new-XMLHttpRequest();
//false,因为第三个参数将强制同步处理
xhr.open('POST','http://httpbin.org/post",假),;
setRequestHeader('Content-type','application/x-www-form-urlencoded');
send('login=test&password=test');
警报(xhr.响应);
如果需要将响应文本传递给selenium,则使用
返回此.responseText
返回此.responseText
而不是
警报(this.responseText)
并将(python)(对于java)的结果分配给变量

下面是python的完整示例:

从selenium导入webdriver
driver=webdriver.Chrome()
js=''var xhr=new-XMLHttpRequest();
xhr.open('POST','http://httpbin.org/post",假),;
setRequestHeader('Content-type','application/x-www-form-urlencoded');
send('login=test&password=test');
返回xhr.response;'''
结果=驱动程序。执行_脚本(js);
result
将包含JavaScript的返回值,前提是js代码是同步的。将
false
设置为
xhr.open(..)
的第三个参数将强制请求同步。将第三个参数设置为
true
或忽略它将使请求异步,这将需要类似
xhr.onload=function({alert(this.responseText);};
的内容来处理结果

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


我发现的最简单的方法是制作一个中介页面,仅用于提交POST请求。让selenium打开页面,提交表单,然后获取最终页面的来源

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
从selenium导入webdriver
html='test'
htmlfile='/tmp/temp.html'
尝试:
打开(htmlfile,“w”)作为文本文件:
text_file.write(html)
除:
打印('无法创建临时HTML文件')
从selenium.webdriver.support.ui导入WebDriverWait
driver=webdriver.Firefox()
get('file://'+htmlfile)
驱动程序。通过_id(“inputbox”)查找_元素。单击();
#等待表单提交并完成加载页面
wait=WebDriverWait(驱动程序,30)
响应=driver.page\u源

Java+JUnit。我可以使用其他工具发出POST请求,但如何让Selenium处理响应?为什么不使用Selenium填写表单并提交表单,确保在执行完成后向您提供正确的数据。但是,如果应用程序B失败,此测试将始终失败——换句话说,我认为您可以需要模拟此交互。@Scott:我将无法访问表单所在的应用程序B。似乎唯一的方法是在您有权访问的应用程序中模拟表单,否则selenium在这种情况下没有任何意义。我认为表单模拟是最好的方法。您甚至可以动态创建此表单用JavaScriptof?