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

ale*_*cxe 8 javascript testing selenium selenium-webdriver protractor

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

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

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

browser.executeScript("document.getElementById('myid').scrollIntoView();");
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?

scrollIntoView()被选择用于仅样品的目的.脚本中的逻辑可能更复杂.

Flo*_* B. 7

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

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

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

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