我们如何使用 ATATA 处理 jQuery 自动完成?

How do we handle jQuery autocomple with ATATA?

这是输入:

这些是预测搜索的结果

我找不到更好的方法来处理 JQuery ATATA 框架中的自动完成输入。

如果没有框架,我可以做这样的事情

private IWebElement SchoolInput => _driver.FindElement(By.Id("autocomplete"));

public void SelectSchool(string school)
{

  // Wait for SchoolInput
  
  SchoolInput.SendKeys(school);
  SchoolInput.SendKeys(Keys.Delete) // Sometimes, results won't show, so need to delete last char
  
  // Now need to locate results div
  var searchResultsDiv = _driver.FindElement(By.Id("ui-id-1"));
  // Wait for searchResultDiv
  var expectedSchool = _driver.FindElement(By.Xpath($"//li[contains(text(),'{school}')]));
  // Wait for expected school
  expectedSchool.Click();

}

您可以通过这种方式为 jQuery UI 自动完成创建自定义 Atata 控件 class:

[ControlDefinition("input", ContainingClass = "ui-autocomplete-input", ComponentTypeName = "autocomplete")]
public class JQAutocomplete<TOwner> : Input<string, TOwner>
    where TOwner : PageObject<TOwner>
{
    [FindByClass("ui-autocomplete", ScopeSource = ScopeSource.Page)]
    public UnorderedList<ListItem<TOwner>, TOwner> DropDownItems { get; private set; }

    public TOwner Select(string value)
    {
        Set(value);

        return DropDownItems[x => x.Content.Value.Contains(value)].Click();
    }
}

然后将其添加到您的页面对象中:

[FindById("autocomplete")]
public JQAutocomplete<_> School { get; private set; }

最后在测试中使用它:

page.School.Select("some value")

在这里您可以找到工作示例源:https://github.com/atata-framework/atata-samples/tree/master/JQueryUI