Javascript 如何在selenium webdriver中禁用promise manager

Javascript 如何在selenium webdriver中禁用promise manager,javascript,selenium,selenium-webdriver,Javascript,Selenium,Selenium Webdriver,如中所述,selenium webdriver使用自动承诺管理器来防止人们重复进行承诺链接 但是,在某些情况下,promise manager所做的连续呼叫应链接的假设是错误的,应将其停用 例如: var isLoaded = function (browser) { var waitForJS = waitForElement(browser, By.css('body.js')); var waitForMobile = waitForElement(browser, By.

如中所述,
selenium webdriver
使用自动承诺管理器来防止人们重复进行承诺链接

但是,在某些情况下,promise manager所做的连续呼叫应链接的假设是错误的,应将其停用

例如:

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]);
};
在这里,我想创建一个通用函数,无论它位于移动登录页还是桌面站点上,都要等待这两个条件中的任何一个得到满足

承诺经理对它的解释是

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 manager并手动安排所有呼叫

下面是
waitForElement

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

获取所需内容的最简单方法是使用查找一个id或另一个id的CSS选择器。以下示例模拟延迟加载。我们正在寻找具有
#foo
#bar
的元素。所以我们使用选择器
#foo,#bar
。在您的情况下,它将是
body.js,#mobile_landing_页面
。这样做是最有效的方法,因为它减少了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();

我知道这已经很古老了,但对于2017年前后谷歌登陆这里的人来说,试试这个:

承诺。任何
都是蓝鸟构造。它返回要解决的第一件事情

如果要同时等待这两个选项,正确的方法是
Promise.all

试着这样做:

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

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

// Then use like this:
isLoaded(browser)
.then((elemCheck) => {
  const hasBodyJsTag = elemCheck[0]
  const hasMobileTag = elemCheck[1]
  console.log('Elem Status:', elemCheck)
})

这正是完美的解决方案。它使代码简单得多,工作起来没有问题。谢谢有时候事情真的比看上去容易得多。