等待在selenium webdriver JavaScript绑定中可以看到多个元素

时间:2016-02-26 01:27:44

标签: javascript node.js selenium selenium-webdriver webdriver

用于JavaScript的selenium webdriver绑定允许通过组合两个等待命令来等待元素可见,如下例所示:

<div id="generalerror" class="validation-advice" style="display:none;">Looks Like Your Payment Method Is Invalid. Please Review Your Information</div>

当我们需要等待一组元素一起可见时,是否有更简单的方法来完成此操作以及如何完成?

2 个答案:

答案 0 :(得分:6)

Promises的一大优势是你可以保持你的异步代码是线性的而不是嵌套的(来自继续传递风格的回调地狱)。

Promise为你提供了返回语句和错误抛出,你会因为继续传递样式而丢失。

在您的情况下,您需要从承诺返回函数中返回承诺,以便您可以链接您的承诺。

示例:Promise.all获取一系列promise并在所有promise解析后解析,如果有任何拒绝,则拒绝该数组。

this.waitForElementsToBecomeVisible = function() {
    return Promise.all([
        driver.wait(webdriver.until.elementIsVisible(usernameTextField), 500),
        driver.wait(webdriver.until.elementIsVisible(firstNameTextField), 500),
        driver.wait(webdriver.until.elementIsVisible(lastNameTextField), 500),
        driver.wait(webdriver.until.elementIsVisible(createEmployeeButton), 500)
    ]);
}

然后你可以将你的承诺链接起来。

driver.get('https://website.com/login').then(function () {
    loginPage = new LoginPage(driver);
    return loginPage.login('company.admin', 'password')
}).then(function () {
    employeePage = new EmployeePage(driver);
    return employeePage.clickAddEmployee()
}).then(function () {
    addEmployeeForm = new AddEmployeeForm(driver);
   /**
    *
    * Wait for elements to become visible
    */
    return addEmployeeForm.waitForElementsToBecomeVisible();
}).then(function() {
    return addEmployeeForm.completeForm(employee);
}).then(function() {
    return addEmployeeForm.clickCreateEmployee();
}).then(function() {
    return employeePage.searchEmployee(employee);
});

您可以看到上面的示例是如何嵌套的,并且很容易维护。你返回一个承诺并继续链接而不是嵌套。我希望这对你有所帮助,并且根本不会让你感到困惑。

答案 1 :(得分:0)

简单 - 编写一个公共/全局函数。将单个或多个Webdriver元素作为输入以及条件(如果需要更改它)。循环直到元素结束并做同样的事情等到每个元素都可见。

这就是我在我的职能中经常这样做的方式。在Ruby中我这样做

for each element in [array of elements], Condition
   [Below is same as your code if working well]
   Driver - Element wait until (Condition satisfied)
   element perform function
end

如果您需要处理多个条件,可以使用switch case语句。 如果只需要执行一次功能,请将功能保持在外面

element perform function