当前位置: 首页 > 知识库问答 >
问题:

如何使用Angularjs在Protractor中选择可见元素

百里诚
2023-03-14

我有一个SPA,其中有多个具有相同类的div。我希望量角器选择可见的div并单击它。我一直得到失败:元素不可见,这让人相信它得到了一些不在这个特定页面上的元素(也许?)。我还得到警告-为定位器By.cssSelector('. myDiv')找到了多个元素-第一个结果将被使用,这再次让我认为它不是单击可见的,而是不可见的。

这是我的规格:

describe('User actions', function () {
    it("should be able to click a my div.", function () {
    var myDiv = element(by.css('.myDiv'));
    myDiv.click();

    // some expect... haven't gotten this far yet.
});

如何选择可见的 .myDiv 并单击它?

共有3个答案

宋鸿
2023-03-14

我的答案中的逻辑和技术实际上是相同的,但我发现我的解决方案更易于重用。

定义如下函数

getFirstDisplayed(locator: Locator) {
  return element.all(locator).filter(x => x.isDisplayed()).first();
}

然后只需转换您的语句,例如

元素(by.css('img[title="删除查询规则"]')). Click();

getFirstDisplayed(by.css('img[title=“Delete query rule”]')).click()

这样您将点击第一个显示的项目

翟元凯
2023-03-14

使用angular时,通常会隐藏相同html位的多个层,但在整个html页面中,要比您想要使用的可见元素更早。

对于一般调试,请将您的站点打开到您期望量角器测试所在的位置,然后打开html并在html上搜索量角器测试正在搜索的元素。注意它是否可见以及它的总体位置。

考虑一下你是否想为页面上元素出现的不同区域添加一个标签,然后使用父和子选择器来得到你想要的标签。

您还可以使用它来仅选择第一个可见元素:

// Takes a protractor webelement and returns the first displayed version
// Ex:
// var coolBox = $('.coolBox');
// var visibleCoolBox = getFirstVisibleProtractorElement(coolBox);
this.getFirstVisibleProtractorElement = function(selector){
    var allElementsOfSelector = element.all(by.css(selector.locator().value));
    return allElementsOfSelector.filter(function(elem) {
        return elem.isDisplayed().then(function(displayedElement){
             return displayedElement;
        });
    }).first();
};

传入您想要的任何元素,它将获取定位器并获取其第一个可见版本。您还可以删除 .first() 部分以返回要使用的可见元素的数组。

编辑:

为了使用它,我将给出一个量角器茉莉的例子。我想这应该行得通,因为页面上有任意数量的所需元素,至少有一个是可见的。不过这不是我想的,所以我可能在某个地方犯了一个错误。

示例规范.js

var examplePage = require('./example_page.js');

describe('Extracting visible elements', function(){
    it('A visible element can be extracted', function(){
        expect(examplePage.isACoolBoxVisible()).toBeTruthy('Error: No visible CoolBoxes');
    });
});

example_page.js

var protractorUtils = require('./protractor_utils.js');

module.exports = new function(){
    var elements = {
        coolBox: $('.coolBox')
    };

    this.getVisibleCoolBox = function(){
        return protractorUtils.getFirstVisibleProtractorElement(elements.coolBox);
    };

    this.isACoolBoxVisible = function(){
        return getVisibleCoolBox.isDisplayed();
    };
};

protractor_utils.js

module.exports = new  function(){
    this.getFirstVisibleProtractorElement = function(selector){
        var allElementsOfSelector = element.all(by.css(selector.locator().value));
        return allElementsOfSelector.filter(function(elem) {
            return elem.isDisplayed().then(function(displayedElement){
                 return displayedElement;
            });
        }).first();
    };
};
颜嘉誉
2023-03-14

您可以过滤()它:

var myDiv = element.all(by.css('.myDiv')).filter(function (elm) {
    return elm.isDisplayed().then(function (isDisplayed) {
        return isDisplayed;
    });
}).first();
 类似资料:
  • 问题内容: 我有一个GWT应用程序,正在尝试使用Selenium编写一些测试。 我正在使用XPath来标识测试页面上的元素。使用将无效,因为这些值是由GWT自动生成的,并且可以更改。当我意识到我可以按其标签找到按钮时,事情进展顺利,如下所示: 但是,当我开始运行多个测试时,我开始遇到问题。我意识到问题是,一旦Javascript生成的GWT应用程序的所有不同“页面”都保留在HTML中的隐藏元素中。

  • 问题内容: 我有一个用于量角器测试的登录功能,它看起来像这样: 我不能使用任何量角器专用的钩子,因为此页面上未使用Angular,因此我必须使用基础的webdriver API。问题是,我似乎无法弄清楚如何使用此包装的webdriver对象等到元素可见。任何帮助,将不胜感激。 问题答案: 尝试使用底层驱动程序的预期条件:

  • 我正在用量角器编写一些e2e测试。我的应用程序是Angular材料2应用程序。在我的测试中,我想按值选择md-select的一个选项。当我检查打开的md-select时,我看到了md-选项项。选项的值在一个属性ng-反映-值中。 假设我有一个值为“optionA”的选项。如何通过该值选择某个选项? 我试过这个: 在里面,我看到了选项的正确数目,但是我如何选择值为“of options”的选项呢?

  • 我是一个新生的QA,我在这里尝试编写一个Protractor脚本,从下拉列表中选择一个选项。我的下拉列表中有两个选项,我正在尝试从数字中选择它。 这是我正在使用的代码。 默认情况下,选项 2 在页面加载时处于选中状态。我需要的是从下拉列表中选择选项1。但是,我的代码不会这样做。 下面是选择选项的代码片段。 提前感谢:)

  • 我正在编写一个Typescript/Productor测试,它需要评估和选择网格上的复选框元素。这些复选框缺少ID。因为我可以获得与这些复选框位于同一行的输入元素的句柄,所以我尝试通过元素查找器(by.id、by.xpath和by.css)的组合来获取它们。但我的尝试失败了。 我想写的是一个小函数,它将根据行上的远程“兄弟”元素和行上的复选框索引,从行中返回目标复选框元素。我已经尝试了几件事,我认

  • 问题内容: 我有这样的 我想引用元素“ x”。我尝试了几种方法,但找不到解决方案。 问题答案: document.getElementById(‘myframe1’).contentWindow.document.getElementById(‘x’) 所有浏览器(包括较旧版本的IE)都支持该功能。 请注意,如果的是从另一个域,您将无法访问其内容,由于同源策略。