Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I test if an img tag exists?

Tags:

protractor

if I do expect(img).not.toBe(null) then I get an error: Error: expect called with WebElement argment, expected a Promise. Did you mean to use .getText()?. I don't want to get the text inside an img, I just want to know if the tag exists on the page.

describe('company homepage', function() {
it('should have a captcha', function() {

    var driver = browser.driver;
    driver.get('http://dev.company.com/');

    var img =driver.findElement(by.id('recaptcha_image'));

    expect(img.getText()).not.toBe(null);
});
});

Passes but I'm not sure it is testing the right thing. Changing the id to something that doesn't exist does fail.

How do I properly test for a tag to exist with protractor in a non-angular app context?

like image 575
Maslow Avatar asked Jan 21 '14 16:01

Maslow


2 Answers

Edit 2:

Per Coding Smackdown below, an even shorter answer is now available in protractor:

expect(element(by.id('recaptcha_image')).isPresent()).toBe(true);


Edit 1:

I discovered isElementPresent() today which is just a more readable shortcut for what I described below. See: http://www.protractortest.org/#/api

Usage for you would be:

driver.isElementPresent(by.id('recaptcha_image')).then(function(present){
    expect(present).toBe(false);
})

Old answer (this works but the above is more reader friendly)

In general you should use findElements (or $$ which is an alias for findElements by css) if you're not sure a tag will be there. Then test for the array length. FindElement (and $) will just throw an error if it cant find the element.

Therefore instead of

var img =driver.findElement(by.id('recaptcha_image'));

expect(img.getText()).not.toBe(null);

use:

driver.findElements(by.id('recaptcha_image')).then(function(array){
    expect(array.length).not.toBe(0);
})

Also, getText() returns a promise which is why you're getting that error.

like image 62
wlingke Avatar answered Oct 13 '22 20:10

wlingke


Using the latest Protractor build you can shorten it down to the following:

expect(element(by.id('recaptcha_image')).isPresent()).toBe(true);
like image 37
Coding Smackdown Avatar answered Oct 13 '22 22:10

Coding Smackdown