您似乎混淆了 assertions 的用途,或者滥用了它们,特别是在您的示例中。仅当您有事物(WebElement、text、attribute 元素等)要验证的确定性时,您才应该使用断言包含预期的值类型(您将其返回到您的assert 或expect 语句以进行最终验证=> 输出是所需的值)。
断言验证 static 值,它们不会轮询 DOM。这就是为什么您拥有.waitForVisible()、waitForText() 或更重要的.waitUntil()(提供更大的灵活性)之类的工具的原因。
诚然,ChaiJS 提供的 expect 断言样式可能有一个令人困惑的词汇(expect 可能会断章取义:它期望 WebElement 是可见的)。只需使用它们来验证不同命令的输出,而不是 WebElements 的状态或其他动态/变化的元素。
话虽如此,作为最佳实践,您应该始终将您的命令(例如:.click())包装到.waitUntil() 块中并确保@ 987654339@ 已准备好执行您即将执行的操作:
- 是不是被前端逻辑渲染到了DOM中? (使用
.isExisting())
- 在 DOM 中是否可见? (您*不能点击
viewport中不可见的元素)
- 它是否可点击? (或您想要对其执行的其他操作...)
最后,一个惯用的动作(在我们的例子中是.click())应该是这样的:
browser.waitUntil(() => {
browser.isExisting(locator);
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') does not exist");
browser.waitUntil(() => {
browser.isVisible(locator);
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') is not visible");
browser.waitUntil(() => {
browser.click(locator);
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') could not be clicked");
您可以将整个内容封装到 custom-command 中,然后根据需要使用它。告别片状测试! :)
* Selenium 是一个以用户为中心的网络自动化工具,因此所有操作都像用户一样执行(用户不能点击不可见的元素,用户不能同时点击多个元素,或者通过输入整个单词或整个段落等来填写input字段)