javascript - 如何在 selenium-webdriver 中禁用 promise 管理器

标签 javascript selenium selenium-webdriver

详情请参阅 https://code.google.com/p/selenium/wiki/WebDriverJs#Promises , selenium-webdriver 使用自动 Promise 管理器来防止人们进行重复的 Promise 链接。

但是,在某些情况下,promise 管理器做出的假设(即连续调用应该链接)是错误的,应该将其停用。

一个例子是:

var isLoaded = function (browser) {
    var waitForJS = waitForElement(browser, By.css('body.js'));
    var waitForMobile = waitForElement(browser, By.css('#mobile_landing_page'));

    return Promise.any([waitForJS, waitForMobile]);
};

在这里,我想创建一个通用函数,无论是在移动着陆页还是桌面网站上,都会等到满足这两个条件中的任何一个。

promise 管理器解释它的方式是

var isLoaded = function (browser) {
    var waitForMobile = waitForElement(browser, By.css('#mobile_landing_page'));
    var waitForJS = waitForElement(browser, By.css('body.js')).then(function () {
        return waitForMobile;
    });

    return Promise.any([waitForJS, waitForMobile]);
};

对于非移动情况,这显然永远无法解决,因为一次只能其中之一成立。

有没有办法完全禁用 promise 管理器并手动安排所有调用?

这是waitForElement的定义

var waitForElement = function (browser, element, timeout) {
    return browser.wait(until.elementLocated(element), timeout);
};

最佳答案

获得您想要的内容的最简单方法就是使用 CSS 选择器来查找一个 id另一个。以下示例模拟延迟加载。我们正在寻找带有 #foo#bar 的元素。所以我们使用选择器#foo, #bar。在您的情况下,它将是 body.js, #mobile_landing_page。这样做是最有效的方法,因为它减少了 Selenium 脚本和浏览器之间的往返次数。

var webdriver = require('selenium-webdriver');
var By = webdriver.By;
var until = webdriver.until;
var firefox = require('selenium-webdriver/firefox');
var Promise = require('bluebird').Promise;

var browser = new firefox.Driver();

browser.get("http://www.example.com");

//
// Decide randomly what we are going to be looking for
//
// This math here is probably not something to be emulated if you need
// serious randomness (e.g. crypto).
//
var flip = Math.round(Math.random(0, 1));

var id = flip ? "foo": "bar";
console.log("We'll be simulating the delayed loading of an element with id", id);

var waitForElement = function (browser, element, timeout) {
    return browser.wait(until.elementLocated(element), timeout);
};

var isLoaded = function (browser) {
    return waitForElement(browser, By.css("#foo, #bar"));
};

// Simulate the delayed loading of the element we are going to look for.
browser.executeScript('\
var id = arguments[0];\
setTimeout(function () {\
  var el = document.createElement("div");\
  el.id = id;\
  document.body.appendChild(el);\
}, 1000);\
', id);

isLoaded(browser);
browser.quit();

关于javascript - 如何在 selenium-webdriver 中禁用 promise 管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28172243/

相关文章:

javascript - 如何在 javascript fullCalendar 中添加事件

java - 在步骤定义文件之间共享相同的 selenium WebDriver

python - 如何在 python 中使用 Selenium WebDriver 截取部分截图?

java - 尝试使用 Selenium WebDriver for Java 从 HTML 表获取数据

javascript - 在智能电视浏览器上运行的 create-react-app

php - 电子邮件保护程序 : Is this code still secure today?

javascript - 是否有针对 testcafe E2E 测试的建议文件结构

java - 如何使用 Selenium Java 设置 <pre> html 标签的值?

html - 一个 Xpath 表达式在 selenium 中不起作用,但在 Firefox 中起作用

python - 当我使用 selenium 爬取网站时出现 python UnicodeEncodeError