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
来存储您的coordinates
或values
。
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中的人类喜欢鼠标滚动的主要内容,如果未能解决你的问题,请参考以下文章