当前位置: 首页 > 知识库问答 >
问题:

使用硒测试真实网站时嘲笑XHR调用

凌炜
2023-03-14

我试图将由Selenium(java绑定)驱动的UI测试与集成层隔离开来。我想截获通过浏览器进行的xhr调用并发回模拟响应。

我尝试配置代理(使用browsermob),可以看到请求通过它。但现在我不知道如何通过拦截xhr调用来返回模拟响应。

   Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

        proxy.addRequestFilter((request, content, messageInfo) -> {
                if (messageInfo.getOriginalUrl().contains("v1/listings/closing.json")) {
                    String messageContents = content.getTextContents();
                    System.out.println("messageContents:: " + messageContents);

                }
                return null;
        });


        try {
            String hostIp = Inet4Address.getLocalHost().getHostAddress();
            seleniumProxy.setHttpProxy(hostIp + ":" + proxy.getPort());
            seleniumProxy.setSslProxy(hostIp + ":" + proxy.getPort());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

        DesiredCapabilities seleniumCapabilities = new DesiredCapabilities();
        seleniumCapabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
        ChromeOptions options = new ChromeOptions();
        options.merge(seleniumCapabilities);

        webDriver = new ChromeDriver(options);

在针对真实/实时网站而非本地主机进行测试时,我希望得到对UI的模拟响应。

共有2个答案

西门飞翮
2023-03-14

使用模拟响应短路请求,并使用Selenium不让其通过。

 String stubResponse = { mocked json response body };

 proxy.addRequestFilter(new RequestFilter() {
        @Override
        public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) {
            if (request.getUri().contains("/v1/listings/closing.json")) {

                //Use DefaultFullHttpResponse for posting the json body
                HttpResponse httpResponse = new DefaultFullHttpResponse(request.getProtocolVersion(), HttpResponseStatus.OK);
                //Close the connection so it doesn't pass through
                httpResponse.headers().add("CONNECTION", "Close");
                //Specify the content-type and charset
                httpResponse.headers().add("Content-Type", "application/json; charset=UTF-8");
                //other headers if necessary
                httpResponse.headers().add("Access-Control-Allow-Headers", "");
                httpResponse.headers().add("Access-Control-Allow-Origin", "*");
                httpResponse.headers().add("Access-Control-Expose-Headers","");

                //replace the body 
                HttpObjectUtil.replaceTextHttpEntityBody((FullHttpMessage) httpResponse, stubResponse);

                return httpResponse;
            }

            return null;
        }
    });
江阳夏
2023-03-14

使用代理。addResponseFilter((响应、内容、消息信息)方法

例子:

proxy.addResponseFilter((response, contents, messageInfo) -> {
        if (/*...some filtering criteria...*/) {
            contents.setTextContents("This message body will appear in all responses!");
        }
    });

参考博客和Github,您将获得模拟响应的示例

您可以考虑Cypress将UI测试与集成测试隔离开来。使用Cypress-Fixture模拟响应很容易

 类似资料:
  • 包括StackTrace。我尝试用这个when(requestBodySpec.body(any())替换body mock。然后返回(requestHeadersSpec);也但是没有用。我认为问题在于模仿单声道。只是反对。不确定可能是什么问题。如果有不同的方法来模拟单声道。请分开反对并通过,请让我知道。

  • 我提到了这个答案,我该如何模拟java。时间本地日期。now()关于如何模拟我的LocalDateTime。now()调用。我基本上遵循了所有步骤,但只使用了LocalDateTime而不是LocalDate。 我的代码的功能是这样的,它应该只在一小时的第15或45分钟运行。因此,我将LOCAL\u DATE\u TIME静态变量设置为: 然后在我的@Before测试方法中,我有以下内容: 这是2

  • 我想在我的发票类中存根methot generateFerenceNumber():

  • 问题内容: 使用Mockito间谍的用例是什么? 在我看来,每个间谍用例都可以使用callRealMethod进行模拟处理。 我可以看到的一个区别是,如果您希望大多数方法调用都是真实的,则可以节省一些代码行以使用模拟与间谍。是这样还是我错过了更大的前景? 问题答案: 答案在文档中: 真正的部分模拟(自1.8.0开始) 最后,在邮件列表上进行了许多内部辩论和讨论之后,Mockito添加了部分模拟支持

  • 我使用appium和java自动化Android应用程序。作为一个初学者,我想知道TestNG和网格之间的区别。冲浪,但不能得到答案。

  • 注: 在testng xml中,如果我将parallel=更改为类或方法,那么它可以很好地运行测试,但它不是并行地一个接一个地运行测试。 如果我保持parallel=“tests”,那么它会并行运行,但它会在同一个VM中打开同一个浏览器三次,这是不正确的。 我的设置: 我设置了11个虚拟机,每个盒子上的每个浏览器都初始化了Selenium网格节点。我已经创建了testng xml,以便在每个框上运