【问题标题】:Selenium C# sendkeySelenium C# 发送键
【发布时间】:2018-06-10 03:30:40
【问题描述】:

您好 Stackoverflow 用户!

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

我的问题:

1.) 我怎样才能给 Selenium 命令,按“空格”键 x 秒?

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

我试过了:

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

我使用:

硒、C#、chromedriver

【问题讨论】:

标签: c# selenium scroll selenium-chromedriver


【解决方案1】:

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();

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你在 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 以向下滚动。

      【解决方案4】:

      这个问题相当棘手……我最多只能给出部分答案。

      我能想到的最好的办法是循环继续发送空格键,因为 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 可能会很好地为您提供解决方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 2021-07-03
        • 2018-04-24
        • 2019-02-11
        • 2020-09-26
        • 1970-01-01
        相关资源
        最近更新 更多