【问题标题】:Protractor - Unable to access element due to fixed Top navigation bar量角器 - 由于固定的顶部导航栏,无法访问元素
【发布时间】:2018-08-09 12:48:11
【问题描述】:

我在使用 jasmine 的量角器时遇到以下问题

由于我的应用程序中固定的顶部导航栏,单击/鼠标悬停不起作用。我需要在网页上单击/执行鼠标悬停。 不幸的是,该元素显示在该固定导航栏的后面。所以滚动直到元素出现并单击 x 和 y 坐标不起作用。

我的依赖是:

量角器版本 5.2.2

节点 8.9.3

硒独立 3.13

chrome driver-2.40

chromebrowser v67

操作系统-Windows 10

提前致谢

【问题讨论】:

  • 欢迎来到 Stack Overflow - 很高兴有你。请阅读 How do I ask a good question?How to create a Minimal, Complete, and Verifiable example 以帮助将 Stack Overflows 内容保持在尽可能高的水平,并增加获得适当答案的机会。请提供您现在拥有的代码,否则我们无法为您提供帮助。
  • 你可以做几件事......总是将所需的元素滚动到页面的中心,总是向下滚动x个像素(导航栏的高度,等等......什么您正在寻找哪种类型的解决方案?请发布您尝试过的代码以及您收到的任何错误消息。
  • 希望这个解决方案可以帮助您解决问题:) stackoverflow.com/questions/27023768/…

标签: selenium-webdriver jasmine protractor gulp-protractor


【解决方案1】:

尝试使用原型 executeScript

只需尝试使用 id、name 或 xpath 从浏览器控制台单击该元素。

例如:

var el = element(by.module('header'));
var tag = browser.executeScript('return arguments[0].click()', el).then(function() {
        expect(something).toMatch(something);
    });

【讨论】:

  • 要明确一点……任何时候你使用 JS 执行一个动作,你就不再是在执行一个用户动作。 Selenium 被设计为仅与用户可以交互的元素进行交互,并围绕此设计使用 JS“作弊”。
【解决方案2】:

另一种方式,与 Bharath Kumar S 的思路相同,并且知道 JeffC 警告这种方法是作弊,我遇到了类似的问题,即 App-Header 一直妨碍我点击,我知道我愿意永远不需要它(例如,寻找其他方式来导航或注销,而不是检查上面的东西)。因此,我做了以下事情,解决了这个问题。请注意,如果您刷新屏幕,则必须再次调用它。另请注意,我使用了来自 https://github.com/hetznercloud/protractor-test-helper 的一些函数,它们的功能与您对它们的名称所期望的一样。

var removeAppHeaderIfAny = async function() {

  //this function hides the app header
  //it is useful to avoid having covers there when Protractor worries that something else will get the click

  let found = false;
  try {
    found = await waitToBeDisplayed(by.className("app-header"), 2000);
  } catch (e) {
    let s: string = "" + e;
    if (s.search("TimeoutError") != 0) flowLog("presumably fine, cover already removed: " + e);
    found = false;
  }
  if (!found) return;

  if (found) {
    let coverElement = await element(by.className("app-header"));
    browser.executeScript(
      "arguments[0].style.visibility='hidden';",
      coverElement
    );
    await waitToBeNotDisplayed(by.className("app-header"), 10000);
  }
  return;
  //note after this is called you will not see the item, so you cannot click it
};

当我查看代码时,我觉得可以删除最后的 if (found) 和相关的括号。但是我粘贴了一些我知道一直在工作的东西,所以我没有搞砸。

如前所述,我知道我愿意放弃使用 app-header,但它有点粗糙。

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 2018-12-12
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多