4

我想使用带有 XML 有效负载的 Selenium IDE 对服务器执行单个 HTTPS POST。我正在与之交互的服务不支持 HTTPS GET,否则我会这样做。(做一个 HTTPS GET 真的很容易,因为整个 URL 都进入了 Selenium打开命令。)我知道还有其他方法可以做 HTTP POST,比如 curl,但是我的 web 测试目前是在 Selenium IDE 中完成的,我没有希望不必担心两三个不同的工具来做我的测试。

我查看了通过 Javascript 提交的 POST并修改了我在那里找到的代码。我把它作为一个 storeEval 命令放在 Selenium IDE 中。代码的最终版本如下:

var method = method || "post"; 
var path = "https://service.url.srv/";
var post = "<xml>payload</xml>";    
var form = document.createElement("form");    
form.setAttribute("method", method);    
form.setAttribute("action", path); 
var hiddenField = document.createElement("input"); 
hiddenField.setAttribute("type", "hidden"); 
hiddenField.setAttribute("name", ""); 
hiddenField.setAttribute("value", post); 
form.appendChild(hiddenField); form.submit();

当我运行示例代码的略微修改版本时,我在 Selenium IDE 日志中收到一条消息,指出“document.body 未定义”。我尝试删除对 document.body 的所有引用,希望一个简单的表单对象本身就足够了。不是。我得到“form.submit 不是函数”。也许有一些 Javascript mojo 会起作用。

我没有在 Google 或 StackOverflow 上找到任何有人试图在 Selenium IDE 中进行 HTTP POST 的参考。如果甚至可以进行 POST,我愿意为 Selenium 编写扩展。

4

3 回答 3

4

这是一个旧线程,但这可能会帮助其他人(比如上周的我!)寻找一种从 Selenium IDE 发送 POST 的方法。

我设法得到了一个可行的解决方案——我只发送参数和一个空的正文,因为我不需要发送数据有效负载,但也许这会对这里的人有所帮助。

在 IDE 中,我将基本 url 保存为 Selenium storedVars 项“testPageBaseUrl”:

<td>store</td>
<td>${TargetEnvironment}/testpage.html</td>
<td>testPageBaseUrl</td>

我的参数字符串也作为storedVars项“params”:

<td>store</td>
<td>com=update&amp;some-param=false&amp;some-id=1</td>
<td>params</td>

然后我调用我的 Selenium IDE 扩展函数,将基本 url 作为参数传递:

<td>postByXMLHttpRequest</td>
<td>testPageBaseUrl</td>
<td></td>

我无法在 IDE 中的函数调用(命令)的 Target 字段中使用多个参数,因此该函数显式访问“params”storedVars 变量。

这是我添加到 user_extentions.js 文件中的函数,然后我在 Selenium IDE 设置中引用该文件:

Selenium.prototype.doPostByXMLHttpRequest = function (baseUrl) {
var httpReq = new XMLHttpRequest();

var params =  storedVars ["params"]; 
httpReq.open("POST",  storedVars[ baseUrl ]);

httpReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
httpReq.setRequestHeader("Content-length", params.length);
httpReq.setRequestHeader("Connection", "close");

httpReq.send(params);
};

一些背景信息: https ://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest http://docs.seleniumhq.org/docs/08_user_extensions.jsp

于 2014-06-02T11:07:11.800 回答
0

据我所知,没有办法通过 Selenium IDE 进行 HTTP POST,我想我试图强迫它做一些它从未打算做的事情。我将使用 JUnit 和 WebDriver 来代替我的 POST。

于 2012-08-23T12:36:03.313 回答
0

您需要使用seleinum.browserbot.getCurrentWindow()来获取窗口并使用其文档成员。

Selenium.prototype.doCustomPost = function (baseUrl) {
    var win = selenium.browserbot.getCurrentWindow();
    var form = win.document.createElement("form");
    form.setAttribute("method", "post"  );
    form.setAttribute("action", baseUrl );

    //StoredVars is a selenium variable that can be added to by:
    //<td> store </td> <td> Value </td> <td> Key </td> 
    for(var key in storedVars ) {
        if(storedVars.hasOwnProperty( key )) {
            var hiddenField = win.document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", storedVars[ key ] );

            form.appendChild(hiddenField);
         }
    }

    win.document.body.appendChild(form);
    form.submit();
};
于 2016-04-27T13:25:07.730 回答