使用CSS选择器来检查元素是否存在于Protractor中

49

在使用量角器进行端到端测试时,我想要通过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.

之后我尝试使用了一个 Promise:

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

这会导致一个错误:

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

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

有人知道如何实现吗?还是说在这里不应该使用element(by.css())方法?

4个回答

102

您可以使用 isPresent 方法来测试是否存在该 element。这里是 Protractor 的文档,您可以查看 isPresent 函数的详细说明。查看 Protractor 文档

因此,您的代码应该类似于:

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

谢谢,这解决了!(请参见我在JB上的评论) - Michiel

28

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

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

非常感谢,我确信我尝试过类似的东西,感觉很愚蠢...你有任何想法为什么我的失败消息中对象中没有提到'isPresent'方法吗? - Michiel
2
因为isPresent是由Protractor作为原型添加的。您在错误消息中看到的那些是从webdriver继承的元素属性。console.log和throws默认情况下不会显示原型。 - hankduan
1
你的代码似乎在检查它是否不存在。你能解释一下吗? - Alex Worden
是的,这就是楼主想要实现的。 - JB Nizet

1
相同的事情,但不同的语法。
let elem = $('.elementClass');
let elemIsPresent = await elem.isPresent();
expect(elemIsPresent).toBe(false);

1

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")
    }
});

5
John,请问你能否解释一下你的答案,以及为什么这比得到将近100个赞的已被接受的答案更好?请用通俗易懂的语言,不要改变原意。 - Quality Catalyst
Truthy和falsy是指在强制转换为布尔值后被评估为true和false的值。除非您希望函数返回不同类型的值。 - John Mburu
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Mark Rotteveel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接