javascript - 在 Protractor 中定位元素与直接在 JavaScript 中定位元素

标签 javascript selenium testing selenium-webdriver protractor

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

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

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

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

这两种方法有什么区别?

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

最佳答案

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

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

第二个比较便宜,因为它执行一个 Selenium 命令 (ExecuteScript),而第一个执行两个 (FindElement 和 ExecuteScript)。向浏览器发送 Selenium 命令的成本相对较高(最少 25 毫秒),并且在多次调用时可能会变得很重要。

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

关于javascript - 在 Protractor 中定位元素与直接在 JavaScript 中定位元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38421587/

相关文章:

java - 如何在 Selenium Webdriver 中使用相同的 session 打开浏览器?

javascript - 来自 Javascript API 的 Selenium WebDriverJS

c# - 如何对 SoapExtension 派生类进行单元测试?

javascript - Socket.io 简单 Node 应用程序不工作

ruby-on-rails - 带有 Selenium 的 Capybara 抛出一个 Net::ReadTimeout:Net::ReadTimeout

asp.net - 关于在发布前测试应用程序的建议?

ruby-on-rails - 使用嵌套资源和关联的 FactoryGirl 对象的 Controller 的 RSpec 测试失败

javascript - 禁止用户更改浏览器选项卡

javascript - 如何防止表单提交后页面跳转?

javascript - 获取循环计数并基于计数 JS/jQuery 迭代循环