问题描述
使用 IEDriver(C# Selenium 绑定)时,我在等待 React 组件出现在屏幕上时遇到了一些非常不稳定的行为。到目前为止,我看过的所有资源都建议在继续测试的其余部分之前对元素使用显式等待。
以下代码的所有排列似乎都有效,但只有约 50% 的时间。更有趣的是来自 HTTP 服务器的 HTTP 响应。值得注意的是,我正在等待的 table
与 axios 请求相关联,因此必须等到它可见。
尝试实施
webdriverwait waitDriver = new webdriverwait(driver,TimeSpan.FromSeconds(60));
<-- Explicit Wait using driver.FindElement -->
waitDriver.Until(driver => driver.FindElement(By.XPath("//table")).displayed);
<-- Explicit Wait using ExpectedConditions -->
waitDriver.Until(ExpectedConditions.ElementIsVisible(By.XPath("//table")));
<-- Explicit Wait using JSExecutor -->
string findTableScript = "return document.getElementsByTagName('table')";
IJavascriptExecutor jsExecutor = (IJavascriptExecutor) driver;
var result = waitDriver.Until(_ => jsExecutor.ExecuteScript(findTableScript));
来自 HTTP 服务器的响应
<-- When it works as expected,polling DOM until the element appears -->
REQUEST [{dateTime}] POST /session/{sessionId}/element {"using":"xpath","value":"//table"}
RESPONSE {"sessionId":"{sessionId}","status": 0,"value":[]}
REQUEST [{dateTime}] POST /session/{sessionId}/element {"using":"xpath","value":[{"ELEMENT":"{elementId}"}]} <-- result
<--When it doesn't work-->
REQUEST [{dateTime}] POST /session/{sessionId}/element {"using":"xpath","value":"complete"} <-- what?
REQUEST [{dateTime}] POST /session/{sessionId}/element {"using":"xpath","value":"complete"}
...continues until timeout
有价值的笔记
- 看来
"complete"
是document.readyState
的结果,我读过它在处理动态元素时可能会产生误导。我不确定为什么这会突然出现在响应中,因为除了发生这种不稳定的问题之外,我在任何其他日志中都没有看到这一点。 - 在调试模式下运行测试时无法重现(首先想到的是竞争条件或异步行为。
async/await
逻辑没有解决问题) - 如果在尝试在页面中搜索元素之前执行
table
,我的测试似乎可以 100% 找到Thread.Sleep(60000)
元素。这让我觉得过早轮询 DOM 会以某种方式使PageSource
或相关的东西短路。- 我非常不喜欢使用 Thread.Sleep 或隐式等待的想法,因为我使用的是 browerstack,因此在针对多个浏览器进行测试时,暂停单个测试一段时间会累加起来。
- 将 WebWaitDriver 的超时持续时间增加到 300 秒只会导致
"complete"
返回 300 秒,即使我可以手动断言,在测试执行期间使用开发工具,table
在屏幕上可见并存在于 DOM 中。 - 在“失败”运行期间,将
driver.PageSource
输出到文件的值为"complete"
。在理想情况下,它包含一个 html 文档。 - 一旦服务器开始用
"value":"complete"
发回响应,此后我将无法检查 DOM 是否有任何其他元素。换句话说,捕获不可避免的WebDriverTimeoutException
并针对相同(或不同)元素重新查询 DOM,会产生更多"value":"complete"
响应。在这一点上,测试执行基本上是死的。 - 如果我传递一个完全不存在的元素,这个问题仍然会出现,它告诉我这不一定是元素本身的问题,而是它正在检查元素的问题。
我已经对这个问题进行了相当多的挖掘,但所有的方法都导致使用显式等待来轮询 DOM,直到元素可见。不幸的是,除了次优的艰苦等待之外,我无法找到稳定的解决方案。在这一点上,我不太关心解决方案,而更感兴趣的是为什么轮询 DOM 似乎会随机触发这种行为。我的临时解决方案是使用 NUnit 的 [Retry()]
,直到找到更优化的方法。
对此的任何建议或调试建议将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)