在其中一个测试中,我需要滚动到元素的视图,这可以通过scrollIntoView()
方法参数化脚本来完成,其中元素位于通过量角器:
var elm = element(by.id("myid"));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
但是,我们也可以直接通过getElementById()
找到元素:
browser.executeScript("document.getElementById('myid').scrollIntoView();");
这两种方法有什么区别?
选择scrollIntoView()
仅用于示例目的。脚本中的逻辑可能更复杂。
答案 0 :(得分:7)
第一个将明确告诉您何时元素丢失,而第二个将引发JavaScript错误,说明null没有.scrollIntoView方法。因此,为了保持第二个可维护,您需要在缺少元素时隐式处理这种情况,并使用适当的消息引发错误。
第一个暴露于意外/陈旧状态。 element(by.id("myid"))
找到的元素可以在执行browser.executeScript()
之前从页面中删除。第二个没有暴露于此问题,因为在执行脚本时页面未更新。
第二个是较便宜的,因为它执行一个Selenium命令(ExecuteScript),而第一个执行两个(FindElement和ExecuteScript)。向浏览器发送Selenium命令相对昂贵(至少25ms),并且可能会在多次呼叫时变得非常重要。
两者都会产生完全相同的结果,最终会在浏览器端调用相同的API。
答案 1 :(得分:3)
有些事情会浮现在脑海中。
继续维护。如果您的.scrollIntoView()
元素定位器发生变化,会发生什么?我想我宁愿使用Selenium而不是JS来找到元素。使用IDE减少使用拼写错误,类型检查等的机会,但IDE不会查看包含JS的字符串。
Selenium可访问性。由于Selenium看不到隐形元素,因此它可能会影响您的选择。如果要尝试滚动到不可见元素,是否需要抛出异常? Selenium会让你知道JS不会在哪里。也许你想故意滚动到一个不可见的元素。寻找隐形元素是JS的工作,但不是Selenium。
可能会有更多,但这是我能想到的全部。