Selenium C#sendkey

时间:2017-12-29 18:31:47

标签: c# selenium scroll selenium-chromedriver

Hello Stackoverflow用户!

在许多互联网网站上,都有一些可滚动的div容器。例如,在Facebook上,如果您点击任何活动,并想知道谁参加此活动。您单击按钮,它会打开一个列表,您可以看到所有人。 另一个例子,如果您访问任何Instagram个人资料并点击“关注者”。然后它再次打开一个列表,您可以看到所有关注者。这些列表可能非常长,并且按下键盘上的“空格”键可以向下滚动所有列表。

我的问题:

1。)如何给Selenium命令,按“空格”键x秒?

2.。)如何将这些列表(不是浏览器网站[仅限div容器])自动滚动到底部?

我试过了:

driver.FindElement(By.XPath("//div[contains(.,'followers')]")).SendKeys(Keys.Space);

我用:

Selenium,C#,chromedriver

4 个答案:

答案 0 :(得分:0)

这个非常棘手......我最多只能得到部分答案。

我能想到的最好的事情就是循环继续发送空格键,因为keyDown命令仅适用于某些键(我可以从文档中看到)。由于链接的数量会持续增长,直到您到达列表的末尾,这是一种了解您是否已触底而非依赖实际Y位置的方法。

        bool atBottom = false;

        while (!atBottom)
        {
            var linkNumber = driver.FindElementsByClassName("_6e4x5").Count;

            driver.FindElementByClassName("_6e4x5").SendKeys(Keys.Space); 

            var newLinkNumber = driver.FindElementsByClassName("_6e4x5").Count;

            atBottom = newLinkNumber.Equals(linkNumber);
        }

但我不能为我的生活让网络驱动程序专注于元素以发送密钥。我尝试了多个类名和xpath ......它几乎就像IG不希望这样自动化。

您可能会发现此Stack question helpful,因为直接调用JavaScript可能会很好地为您提供解决方法。

答案 1 :(得分:0)

你在selenium中有LocationOnScreenOnceScrolledIntoView。您可以使用它将所需的div滚动到视图中:

        public static IWebElement FindElementOnPageScrolling(this IWebDriver driver, By element)
    {
        RemoteWebElement remoteElement = (RemoteWebElement)driver.FindElement(element);
        var foo = remoteElement.LocationOnScreenOnceScrolledIntoView;
        return remoteElement;
    }

这通常适用于chrome和firefox,在IE和Edge中它至少在我的经验中不会很好地工作。

如果你还没试过,你也可以尝试发送Key.Down或Key.End向下滚动。

答案 2 :(得分:0)

首先,请尝试使用ClickAndHold(IWebElement element)方法作为Actions类的一部分。对于第二个,您可以尝试使用JS命令((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView();",element);。您将需要找到列表中的最后一个元素,并将其作为参数传递给JS函数。

答案 3 :(得分:0)

KeyDown():该方法模拟需要按下特定键盘键时的键盘动作。

KeyUp():使用 KeyDown() 方法按下的键盘键不会自动释放,因此使用 keyUp() 方法显式释放该键。

Actions action = new Actions(driver);
action.KeyDown(Keys.Space);
System.Threading.Thread.Sleep(1000); // trying to press space for X= 1000 ms 
action.KeyUp(Keys.Space);
action.Build().Perform();