Atata框架是否存在等价于Selenium Wait.Until的复杂等待功能?
Atata框架中的复杂等待实现(等价于Selenium的wait.until)
当然有!Atata框架完全支持自定义复杂条件的等待逻辑,和Selenium的wait.until功能对齐,而且还能结合Atata的页面对象模型写出更优雅的代码——那些[WaitFor]、[Until]属性只是为简单场景提供的语法糖而已。
下面是几种实现复杂等待的常用方式:
1. 直接使用封装的WebDriverWait
Atata底层封装了Selenium的WebDriverWait,你可以通过AtataContext.Current.Driver.Wait()直接调用,写法和原生Selenium几乎一致,适合需要直接操作Driver的场景:
// 等待状态文本包含"Completed",同时成功图标可见 AtataContext.Current.Driver.Wait().Until(driver => driver.FindElement(By.Id("order-status")).Text.Contains("Completed") && driver.FindElement(By.CssSelector(".success-icon")).Displayed);
如果是在页面对象类内部,也可以基于当前组件的Scope来等待,更贴合上下文:
// 在PageObject类中,基于当前组件的DOM范围等待 Scope.Wait().Until(scope => scope.FindElement(By.ClassName("sub-status")).Text == "Ready" && scope.FindElement(By.Name("confirm-btn")).Enabled);
2. 结合Atata组件查询写Lambda等待
利用Atata的页面元素定位能力,你可以直接在页面对象中引用已定义的元素,写出更简洁易维护的复杂条件:
// 假设你的Page类已定义了OrderStatus、SuccessIcon、TrackingNumber元素 Wait.Until(_ => _.OrderStatus.Text.Contains("Completed") && _.SuccessIcon.IsVisible && _.TrackingNumber.Value.IsNotEmpty());
也可以针对单个组件进行等待:
// 等待某个表格组件满足多行数据加载完成且特定行状态正确 OrderTable.WaitUntil(table => table.Rows.Count > 5 && table.Rows[x => x.Status == "Shipped"].Exists);
3. 封装可复用的等待扩展方法
如果某个复杂等待逻辑需要在多个测试中复用,推荐封装成扩展方法,让代码更简洁:
public static TPage WaitForOrderToBeFulfilled<TPage>(this TPage page) where TPage : PageObject<TPage> { return page.WaitUntil(x => x.OrderStatus.Text == "Fulfilled" && x.ShippingLabel.IsVisible && x.DeliveryDate.Value != null, timeout: TimeSpan.FromMinutes(3), // 自定义超时 interval: TimeSpan.FromSeconds(2)); // 自定义轮询间隔 }
之后在测试中就能直接调用:
Go.To<OrderDetailsPage>() .WaitForOrderToBeFulfilled() .PrintShippingLabel();
需要注意的是,所有这些等待方式都支持自定义超时时间和轮询间隔,默认超时继承自AtataContext的配置,你也可以根据需求单独指定。
内容的提问来源于stack exchange,提问作者Dariusz Woźniak
相关产品推荐
相关产品推荐

