在Protractor中直接在JavaScript中定位元素

时间:2016-07-17 13:09:50

标签: javascript selenium testing selenium-webdriver protractor

在其中一个测试中,我需要滚动到元素的视图,这可以通过scrollIntoView()方法参数化脚本来完成,其中元素位于通过量角器:

var elm = element(by.id("myid"));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());

但是,我们也可以直接通过getElementById()找到元素:

browser.executeScript("document.getElementById('myid').scrollIntoView();");

这两种方法有什么区别?

选择scrollIntoView()仅用于示例目的。脚本中的逻辑可能更复杂。

2 个答案:

答案 0 :(得分:7)

第一个将明确告诉您何时元素丢失,而第二个将引发JavaScript错误,说明null没有.scrollIntoView方法。因此,为了保持第二个可维护,您需要在缺少元素时隐式处理这种情况,并使用适当的消息引发错误。

第一个暴露于意外/陈旧状态。 element(by.id("myid"))找到的元素可以在执行browser.executeScript()之前从页面中删除。第二个没有暴露于此问题,因为在执行脚本时页面未更新。

第二个是较便宜的,因为它执行一个Selenium命令(ExecuteScript),而第一个执行两个(FindElement和ExecuteScript)。向浏览器发送Selenium命令相对昂贵(至少25ms),并且可能会在多次呼叫时变得非常重要。

两者都会产生完全相同的结果,最终会在浏览器端调用相同的API。

答案 1 :(得分:3)

有些事情会浮现在脑海中。

  1. 继续维护。如果您的.scrollIntoView()元素定位器发生变化,会发生什么?我想我宁愿使用Selenium而不是JS来找到元素。使用IDE减少使用拼写错误,类型检查等的机会,但IDE不会查看包含JS的字符串。

  2. Selenium可访问性。由于Selenium看不到隐形元素,因此它可能会影响您的选择。如果要尝试滚动到不可见元素,是否需要抛出异常? Selenium会让你知道JS不会在哪里。也许你想故意滚动到一个不可见的元素。寻找隐形元素是JS的工作,但不是Selenium。

  3. 可能会有更多,但这是我能想到的全部。