【问题标题】:How to make the selenium webdriver script to wait for backend api request to return a response?如何使 selenium webdriver 脚本等待后端 api 请求返回响应?
【发布时间】:2019-07-06 21:00:40
【问题描述】:

我正在尝试使用 selenium webdriver + Java + ngwebdriver 自动化混合 angularjs 2 (2.4.10) Web 应用程序。

通过自动化基本登录脚本来考虑一个简单的案例。 在登录页面中,我使用 sendkeys 填写用户名和密码字段,并使用 .click 方法点击提交按钮,然后我对主页标题进行断言。脚本运行顺利并退出驱动程序实例。

但是当脚本点击提交按钮时,在后端会进行 api 调用并且尚未收到响应。

从前端实现了测试自动化,但用户登录方法没有返回响应。

所以我希望我的 selenium webdriver 脚本等待所有后端 api 请求返回响应。然后转到下一步?可能吗。

【问题讨论】:

  • 如果登录成功,下一步是什么,因为在成功登录后,无论活动发生在哪里,我们都必须通过添加隐式或显式等待直到该活动出现
  • 隐式等待是加载元素,所以基本上它使脚本等待元素出现/在网页中可见,甚至显式等待元素,即显式等待该元素。但我担心后端 API 调用。
  • 如果您知道硒用于 UI 自动化而不是后端 API,但如果响应时间较短,那么您可以使用等待那么多时间来响应并等待下一个元素不是吗。。
  • 我很清楚这一点,但我一直在寻找类似在网络日志模式下运行/初始化浏览器/浏览器驱动程序并自动捕获这些请求并让我的脚本等待 API 响应和然后 selenium webdriver 进入下一步。这就是我要找的。​​span>
  • 我相信您是在要求等待浏览器的 xhr 请求,对吧?一旦加载了所有“静态”元素——页面的结构、布局、导航,应用程序向 BE 发送请求以获取一些数据;当 xhr req 收到响应时,该数据将被注入并在页面中可视化 - 如果我正确理解您的问题,您希望此过程在继续之前完成。

标签: java selenium selenium-webdriver


【解决方案1】:

使用下面的代码等到使用 ngWebDriver 完成请求,如下所示:

ngWebDriver.waitForAngularRequestsToFinish();

然后使用任何显式等待方法来检查着陆页上元素的可见性。

【讨论】:

  • 当您使用 ngWebDriver.waitForAngularRequestsToFinish(); 时,无需使用任何形式的隐式等待或显式等待;此 waitForAngularRequestToFinish() 等待所有组件以及请求。所以不需要。
  • 这取决于角度请求的实现和页面渲染。有时,请求完成后页面不会立即呈现。因此,在页面加载或导航时执行任何操作之前,最好先明确等待
  • 在我的 Angular 应用程序中,我没有使用单个显式等待,因为 waitForAngularRequestToFinish() 正在执行所有等待。因为我在请求完成时也监控了网络,所以所有组件都已加载。
  • @shrini 感谢您的回答,我已经使用过这种方法,但我可以看到很多自定义小部件在应用程序中使用,例如:文件上传、日历。这些小部件的响应很晚,在那个时间范围内,测试脚本将移至下一步。所以我只是在想如何在我的框架中处理这样的自定义实现?
  • 尝试使用显式等待来等待这些元素可见或可点击。这应该可以解决等待问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2018-08-20
  • 2018-01-13
  • 2020-04-20
  • 1970-01-01
相关资源
最近更新 更多