【问题标题】:How to keyPress Page Down multiple times in selenium WebDriver using java?如何使用java在selenium WebDriver中多次按下Page Down?
【发布时间】:2018-01-07 04:29:15
【问题描述】:

我想使用 Java 的 Selenium WebDriver 中的 Robot 类向下滚动。我发现为了访问网页中所需的元素,我必须按 PgDn 按钮 28 次。因此,我想使用 Robot 类按 PgDn 按钮 28 次。我为此编写的代码如下:

try {
    Robot robot = new Robot();

    for(int i=0; i<29; i++) {
        robot.keyPress(KeyEvent.VK_PAGE_DOWN);
    }

} catch (AWTException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
}

我使用了一个 for 循环来执行此操作,但它不起作用。 PgDn KeyEvent 只执行一次。

【问题讨论】:

  • 你的方法效率不高,而且很脆弱。只需抓住所需的元素并滚动到它。
  • 是的,杰夫。这肯定是另一个有利可图的解决方案。我以前不知道这个程序。我感谢您的支持。不过,我还有一个问题要问你。您能否告诉我,为什么您认为使用 for 循环的过程很脆弱或效率低下?我的意思是与您建议的程序相比有哪些缺点?
  • @JeffC - 不幸的是,您建议的解决方案不起作用,因为驱动程序无法使用 driver.findElement() 找到所需的元素因此, jse.executeScript("arguments[0].scrollIntoView( true);", element) 不起作用。首先,需要向下滚动到所需元素所在的页面所需部分。然后只有 WebElement element = driver.findElement(..) 可以工作。在这种情况下,我会看到以下异常:无法找到元素:{“method”:“xpath”,“selector”:“//*[@id='news-feed']/section[28]/article /section/a/div/h1"}
  • for 循环很脆弱,因为如果页面布局发生变化并且所需元素在 28 时不再可用怎么办?屏幕分辨率、其他设备,甚至其他浏览器也可能不一样。

标签: java selenium


【解决方案1】:

我对这种方法的主要问题是它很脆弱,如果页面内容或布局或屏幕分辨率或浏览器/设备发生变化,很可能会破坏这个脚本。

我会这样处理它:

  1. 加载页面
  2. 搜索元素
  3. 向下滚动并转到 2

基本上,您会反复向下滚动并搜索元素,直到找到它或到达页面底部。

脚本

int currentHeight = 1;
int lastHeight = 0;
boolean endOfPage = false;
while (!isElementPresent(locator) && !endOfPage)
{
    currentHeight = scrollDown();
    endOfPage = currentHeight == lastHeight;
}
if (!endOfPage)
{
    // do something with the desired element
}
else
{
    // log error that the element was not found before reaching end of page
}

支持功能

public static int scrollDown()
{
    JavascriptExecutor js = ((JavascriptExecutor) driver);
    js.executeScript("window.scrollTo(0, document.body.scrollHeight);");

    return (int) (long) js.executeScript("return document.body.scrollHeight;");
}

public static boolean isElementPresent(By locator)
{
    return !driver.findElements(locator).isEmpty();
}

【讨论】:

  • 你好杰夫,你的观点完全正确。第二天我尝试重现该问题时,我的 for 循环代码无法正常工作。这是因为页面布局由于某些部署而发生了变化。感谢您就此问题提供宝贵的经验丰富的反馈。
  • 您好 Jeff,非常感谢您为我的问题提供的解决方案是绝对正确的,并且您提供的代码片段工作得非常好。再次感谢。
【解决方案2】:

如果我们还需要添加密钥释放。下面的代码可能会给你一些想法。

try
{
    Robot robot=new Robot();

    robot.keyPress(KeyEvent.VK_A);
    robot.keyRelease(KeyEvent.VK_A);

    robot.mousePress(KeyEvent.BUTTON1_MASK);
    robot.mouseRelease(KeyEvent.BUTTON1_MASK);
}
catch(Exception e)
{}

希望这会有所帮助。谢谢。

【讨论】:

    【解决方案3】:

    尝试在 keyPress 之后添加 keyRelease

    robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
    

    【讨论】:

    • 你好斯特凡。只需添加 keyRelease,我的代码就可以正常工作。我感谢您的帮助。我对这个问题还有另一个问题。如果遇到这种我可能不得不使用循环的问题,是否总是需要在每次按键后添加 keyRelease?
    • 很高兴为您提供帮助,如果您满意,请接受答案。原因是页面上的 javascript 可能会触发 down 或 release 事件,这就是您必须这样做的原因将它们都发送,但将它们置于循环中应该不是问题。如果您的页面正在捕获向下或释放事件,您可能需要添加一些睡眠计时器,因为您的 javascript 代码必须在下一个按键循环之前完成执行。
    【解决方案4】:

    只需在 keyPress 后添加 keyRelease,我的代码就可以正常工作。我感谢你们所有的 cmets 在这方面帮助我。

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2015-12-14
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多