【问题标题】:Use element by css to check if element exists in Protractor通过css使用元素检查量角器中是否存在元素
【发布时间】:2021-04-22 21:02:17
【问题描述】:

在量角器端到端测试中,我想使用 element(by.css(...)) 检查元素是否存在,我的代码:

var myElement = element(by.css('.elementClass'));
expect(myElement).toBeUndefined;

这个测试失败了,它说:

    Expected { locator_ : { using : 'css selector', value : 'div[ng-switch-
    when="resultNav"]' }, parentElementFinder_ : null, opt_actionResult_ :
    undefined, opt_index_ : undefined, click : Function, sendKeys : Function, 
getTagName : Function, getCssValue : Function, getAttribute : Function, getText
 : Function, getSize : Function, getLocation : Function, isEnabled : Function, 
isSelected : Function, submit : Function, clear : Function, isDisplayed : 
Function, getOuterHtml : Function, getInnerHtml : Function, toWireValue : 
Function } to be undefined.

之后我尝试使用承诺:

element(by.css('.elementClass')).then( functtion(data) {
    expect(data.getText()).toBeUndefined();
});

这会导致错误:

错误:使用定位器 By.CssSelector(...) 找不到元素

是的,我知道找不到任何元素,但是如何使用 element(by.css(...)) 创建工作测试?

有谁知道如何做到这一点?还是element(by.css()) 不是这里使用的方法?

【问题讨论】:

    标签: angularjs protractor e2e-testing


    【解决方案1】:

    您可以使用isPresent 测试element 是否存在。 Here are the protractor docs 用于 isPresent 函数。

    所以,你的代码应该是这样的:

    var myElement = element(by.css('.elementClass'));
    expect(myElement.isPresent()).toBeFalsy();
    

    【讨论】:

    • 谢谢你这样做了! (也请参阅我在 JB 的评论)
    【解决方案2】:

    你需要测试元素是否不存在:

    expect(element(by.css('.elementClass')).isPresent()).toBe(false);
    

    【讨论】:

    • 非常感谢,我确定我尝试过这样的事情,我觉得很愚蠢......你知道为什么我的失败消息中的对象中没有提到'isPresent'方法吗?
    • 因为 isPresent 被量角器添加为 prototype。您在错误消息中看到的那些是从 webdriver 作为元素的属性 继承的。默认情况下,console.log 和 throws 不会显示原型
    • 您的代码似乎正在检查它是否存在。你能解释一下吗?
    • 是的,这就是 OP 想要实现的目标。
    【解决方案3】:

    Truthy 和 falsie 指的是在被强制为布尔值后被评估为 true 和 false 的值,除非您希望函数返回不同类型的值。

    var myElement = element(by.css('.elementClass'));
    myElement.isPresent().then(function (elm)
    {
        if (elm)
        {
            console.log("... Element was found")
            expect(myElement.getText()).toBeUndefined();
        } else {
            console.log("... Element was not found")
        }
    });
    

    【讨论】:

    • 约翰,请有机会解释你的答案,为什么这是一个比接受了近 100 个赞成的答案更好的解决方案?
    • truthy 和 falsy 是指在被强制为布尔值后被评估为 true 和 false 的值。除非你想让你的函数返回不同类型的值。
    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
    【解决方案4】:

    相同,但语法不同

    let elem = $('.elementClass');
    let elemIsPresent = await elem.isPresent();
    expect(elemIsPresent).toBe(false);
    

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多