While writing selenium tests in Python, I got used to using Explicit Waits a lot for waiting for a page to load, or for waiting for an element to become visible, or clickable etc:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
The key concept here is providing an Expected Condition to wait for, there are multiple types:
Using Expected Conditions makes the code cleaner and more reliable comparing to using sleeps with hardcoded time intervals.
Now, we are switching our end-to-end testing infrastructure to protractor a lot.
Are there similar Expected Conditions in protractor as there are in python-selenium or
java-selenium? If not, what is the canonical way to explicitly wait for a condition in protractor?
I’ve looked through protractor documentation and found nothing about it.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Once feat(expectedConditions) is in (probably protractor 1.7), you can do:
var EC = protractor.ExpectedConditions;
var e = element(by.id('xyz'));
browser.wait(EC.presenceOf(e), 10000);
expect(e.isPresent()).toBeTruthy();
Please note though, if you’re working with an Angular app and your test requires these conditional waits, it’s a big red flag for what you’re doing, as protractor should handle waits natively.
Method 2
In Protractor you can use browser.wait(fn, timeout).
Example:
var element = by.id('myDynamicElement');
browser.wait(function() {
return ptor.isElementPresent(element);
}, 10000);
expect(ptor.isElementPresent(element)).toBeTruthy();
Method 3
waitForControlVisible(locator: string, timeout: number) {
try {
const element = this.findElement(locator);
const condition = browser.ExpectedConditions;
browser.wait(condition.visibilityOf(element), timeout);
} catch (e) {
console.log(e.message);
console.error('Control not visible.', e);
}
}
Maybe help you, wait for element visibility in DOM.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0