java和selenium中的人类喜欢鼠标滚动

Posted

技术标签:

【中文标题】java和selenium中的人类喜欢鼠标滚动【英文标题】:human like mouse scroll in java and selenium 【发布时间】:2018-10-09 08:27:02 【问题描述】:

首先我想说我是 3 天前开始编程的。所以我几乎是一个初学者。除了我在这里介绍的东西之外,我不打算从事编程,我现在只需要一个简单的程序,我想自己做,纯粹是作为一种爱好。我正在用 Selenium 和 java 做这件事。因此,我需要一个代码,该代码将在 Web 浏览器中向下/向上滚动 Web 应用程序,使其尽可能真实。我目前正在使用此代码:

javascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript ("window.scrollBy (0.1500)", "");

没关系,但是这段代码看起来像按下向下翻页按钮而不是滚动。

然后,我想做以下事情:

js.executeScript ("window.scrollBy (0.50)", "");
js.executeScript ("window.scrollBy (0.30)", "");
js.executeScript ("window.scrollBy (0.33)", "");
js.executeScript ("window.scrollBy (0.42)", "");
js.executeScript ("window.scrollBy (0.45)", "");
js.executeScript ("window.scrollBy (0.24)", "");
js.executeScript ("window.scrollBy (0.19)", "");
js.executeScript ("window.scrollBy (0.50)", "");

所以现在这段代码向下滚动页面,就像使用滚轮用鼠标滚动一样,但是正如您所看到的,它看起来不像一个“优雅”的解决方案,我确信有更好的解决方案,但是我 3 天的经验,这是我能做的最好的。

那么,有没有人愿意帮助我更高效的代码,而不是使用数百万行来做同样的重复工作......我不知道,比如:

js.executeScript ("window.scrollBy (0,50,45,66,78,43,56,87)", "");

程序可以在一行和几个变量中执行需要完成的操作,并获取时间间隔和/或从“0,50,45,66,78,43,56,87 滚动的像素"

【问题讨论】:

您的确切用例是什么?为什么要滚动? 【参考方案1】:

首先让我们使用array 来存储您的coordinatesvalues

JavaScript 数组

一个数组可以在一个名称下保存多个值,并且您可以访问 通过引用以下简单语法的索引号来获取值:

var array_name = [item1, item2, ...];

对于您的示例,可能如下所示:

var values = [0.50, 0.33, 0.33, 0.42, 0.45, 0.24, 0.19, 0.50];

现在您可以为滚动创建自己的function,使用上面创建的array 中存储的所有值。结合循环,这将被重复。

function scrollFunction() 

    // Creating our needed variables
    var values, vLength, I;

    // Filling the array
    values = [0.50, 0.33, 0.33, 0.42, 0.45, 0.24, 0.19, 0.50];
    vLength = values;

    // By using this for-loop this process will repeat with with all of the variables from the array. However the next value is used, not the same one every time!
    for (i = 0; i < vLength; i++) 
        window.scrollBy (values[i], ""); // Update: deleted one ")"
    

要创建平滑的滚动效果,我建议使用不同的滚动功能:

window.scrollBy( top: values[i], left: 0, behavior: 'smooth' );

【讨论】:

我可以在 selenium 中使用 JavaScript 数组吗?我已经尝试过您的代码,但出现了一些错误,例如:令牌“)”上的语法错误,删除令牌“”上的语法错误,在 UsingActionsClass.UsingActions.main(UsingActions.java:20) 处删除此令牌 不,现在我得到错误:语法错误,插入“SimpleName”以完成表达式语法错误,插入“VariableDeclarators”以在 UsingActionsClass.UsingActions.main(UsingActions.java:20) 处完成 LocalVariableDeclaration 以防万一你想知道这是我的完整代码 -> pastebin.com/eawqKpv4 我也试过这个pastebin.com/5XAMPr98,还是一样的错误。【参考方案2】:

尝试在executeScript()方法中实现arguments[0].scrollIntoView(true);。如果要向下滚动到最后,请选择FOOTER作为目标元素。

WebElement elem =  driver.findElement(By.id("ID OF FOOTER ELEMENT"));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].scrollIntoView(true);", elem);

如果 id 不可用,您可以使用 By.className("CLASSNAME OF FOOTER ELEMENT")By.xpath("XPATH SELECTOR OF FOOTER")By.cssSelector("CSS SELECTOR OF FOOTER")

注意:您可以滚动到定位目标元素选择器的任何位置。

【讨论】:

我知道如何滚动到特定元素或页面的顶部/底部,我想知道如何像使用鼠标一样滚动,以便查看页面元素的加载情况。

以上是关于java和selenium中的人类喜欢鼠标滚动的主要内容,如果未能解决你的问题,请参考以下文章

selenium之鼠标操作详解

如何用selenium模拟鼠标操作

Selenium WebDriver如何使滚动条滚动到最元素位置

通过拖动鼠标滚动图像

Java-Selenium自动化教程(学了不亏)

Selenium-测试对象操作之:浏览器滚动条