【问题标题】:C# Selenium simulate keyup with ChromeDriverC# Selenium 使用 ChromeDriver 模拟 keyup
【发布时间】:2022-01-26 10:53:00
【问题描述】:

我目前正在测试文本输入的行为,它在键入搜索词时对 keyup 事件的列表应用过滤。

我有以下代码:

public IWebElement txtSearchInput => _chromeDriver.FindElement(By.XPath("//input[contains(@class, 'search-input')]"));

public void TypeSearchInput(string searchTerm)
{
    txtSearchInput.Click();
    txtSearchInput.SendKeys(searchTerm);
}

它成功在输入中添加了搜索词,但由于未模拟 keyup 事件(因此未过滤列表),因此未启动过滤。

到目前为止,我尝试将上述方法附加到txtSearchInput.SendKeys(Keys.Up);,但没有奏效,我看不到任何解决方法。

这是在 Angular 上编写的前端实现的参考:

     <input type="text"
            class="search-input"
            placeholder="Type to filter.."
            [(ngModel)]="searchTerm" 
            (keyup)="filterUsers()"/>

任何想法/帮助将不胜感激。只是为了强调设置是 SpecFlow、Selenium、ChromeDriver、VS 2022。谢谢

【问题讨论】:

    标签: c# selenium-chromedriver specflow


    【解决方案1】:

    您可以使用 Selenium 框架的Keys 类并发送 Enter 键,因此我可以假设在发送 Enter 键后过滤将起作用。

    txtSearchInput.SendKeys(searchTerm + Keys.Enter);
    

    更新:

    因为这是一个 Angular 站点,Selenium 应该等到 Angular 初始化。

    所以这里是等待页面完全加载的函数:

    private void WaitForAngular(IWebDriver driver)
    {
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
        wait.Until(webDriver =>
        {
            return ((IJavaScriptExecutor)webDriver)
                .ExecuteScript(
                    "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1")
                .Equals(true);
        });
    }
    
    

    感谢this article 正确的方向。

    以及调用代码:

    driver.Navigate().GoToUrl("http://angularsamplegithubproject.s3-website-us-east-1.amazonaws.com/");
    WaitForAngular(driver);
    string xpath = "//input[contains(@class, 'search-input')]";
    IWebElement txtSearchInput = driver.FindElement(By.XPath(xpath));
    txtSearchInput.Click();
    txtSearchInput.SendKeys("moj");
    
    

    【讨论】:

    【解决方案2】:

    在应用了几种技术之后,问题似乎是 ChromeDriver 的速度,而不是 keyup 没有被触发。

    作为一种解决方法,我最终进行了以下修改:

            public void TypeSearchInput(string searchTerm)
            {
                txtSearchInput.Click();
                foreach (var character in searchTerm)
                {
                    Thread.Sleep(200);
                    txtSearchInput.SendKeys(character.ToString());
                }
            }
    

    我希望这对遇到同样问题的人有所帮助。

    【讨论】:

    • 此解决方案之所以有效,是因为 Thread.Sleep(200) 足以进行角度初始化。请看我更新的答案。
    • 确实,这就是为什么 ny 解决方案有效的原因(正如我所说,由于 webdriver 的速度)。感谢您抽出宝贵时间进行调查。我只是赞成你的回答,因为它也适用于这种情况
    猜你喜欢
    • 2015-02-16
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2012-08-15
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多