mirror of
https://github.com/appium/appium.git
synced 2026-02-12 04:50:08 -06:00
refactored webview tests
This commit is contained in:
6
test/functional/android/chrome/alerts-specs.js
Normal file
6
test/functional/android/chrome/alerts-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/alerts-base')(desired);
|
||||
});
|
||||
6
test/functional/android/chrome/basics-specs.js
Normal file
6
test/functional/android/chrome/basics-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/basics-base')(desired);
|
||||
});
|
||||
6
test/functional/android/chrome/cookies-specs.js
Normal file
6
test/functional/android/chrome/cookies-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/cookies-base')(desired);
|
||||
});
|
||||
4
test/functional/android/chrome/desired.js
Normal file
4
test/functional/android/chrome/desired.js
Normal file
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
browserName: 'chrome',
|
||||
enablePerformanceLogging: true
|
||||
};
|
||||
6
test/functional/android/chrome/execute-async-specs.js
Normal file
6
test/functional/android/chrome/execute-async-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/execute-async-base')(desired);
|
||||
});
|
||||
6
test/functional/android/chrome/execute-specs.js
Normal file
6
test/functional/android/chrome/execute-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/execute-base')(desired);
|
||||
});
|
||||
6
test/functional/android/chrome/frames-specs.js
Normal file
6
test/functional/android/chrome/frames-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/frames-base')(desired);
|
||||
});
|
||||
6
test/functional/android/chrome/iframes-specs.js
Normal file
6
test/functional/android/chrome/iframes-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/iframes-base')(desired);
|
||||
});
|
||||
6
test/functional/android/chrome/implicit-wait-specs.js
Normal file
6
test/functional/android/chrome/implicit-wait-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/implicit-wait-base')(desired);
|
||||
});
|
||||
6
test/functional/android/chrome/window-title-specs.js
Normal file
6
test/functional/android/chrome/window-title-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("chrome @android-arm-only", function () {
|
||||
require('../../common/webview/window-title-base')(desired);
|
||||
});
|
||||
@@ -1,755 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
var env = require('../../helpers/env')
|
||||
, setupBase = require("./setup-base")
|
||||
, wd = require('wd')
|
||||
, Q = require("q")
|
||||
, _ = require('underscore')
|
||||
, webviewHelper = require("../../helpers/webview")
|
||||
, loadWebViewBase = webviewHelper.loadWebView
|
||||
, spinTitle = webviewHelper.spinTitle
|
||||
, spinWait = require('../../helpers/spin.js').spinWait;
|
||||
|
||||
// possible apps: safari, chrome, iwebview, WebViewApp, custom app
|
||||
module.exports = function (app) {
|
||||
app = app || 'WebViewApp';
|
||||
var browserName = "";
|
||||
var isChrome = app === "chrome" || app === "chromium";
|
||||
var testEndpoint = isChrome ? env.CHROME_TEST_END_POINT : env.TEST_END_POINT;
|
||||
|
||||
if (isChrome || app === "safari") {
|
||||
browserName = app;
|
||||
app = "";
|
||||
}
|
||||
|
||||
function _skip(reason, done) {
|
||||
console.warn("skipping: " + reason);
|
||||
done();
|
||||
}
|
||||
|
||||
var setup = function (context) {
|
||||
return setupBase(context, {
|
||||
nativeWebTap: true
|
||||
, app: app
|
||||
, browserName: browserName
|
||||
, safariIgnoreFraudWarning: true
|
||||
, enablePerformanceLogging: true
|
||||
}, {'no-reset': true});
|
||||
};
|
||||
|
||||
var loadWebView = function (driver, urlToLoad, titleToSpin) {
|
||||
return loadWebViewBase(app || browserName, driver, urlToLoad, titleToSpin);
|
||||
};
|
||||
|
||||
describe('window title', function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(driver).nodeify(done);
|
||||
});
|
||||
it('should return a valid title on web view', function (done) {
|
||||
driver
|
||||
.title().should.eventually.include("I am a page title")
|
||||
.then(function () {
|
||||
if (isChrome) {
|
||||
return;
|
||||
}
|
||||
return driver
|
||||
.execute("mobile: leaveWebView")
|
||||
.title()
|
||||
.should.be.rejectedWith(/status: 13/);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe('webview basics', function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(driver).nodeify(done);
|
||||
});
|
||||
it('should find a web element in the web view', function (done) {
|
||||
driver
|
||||
.elementById('i_am_an_id').should.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should find multiple web elements in the web view', function (done) {
|
||||
driver
|
||||
.elementsByTagName('a').should.eventually.have.length.above(0)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should fail gracefully to find multiple missing web elements in the web view', function (done) {
|
||||
driver
|
||||
.elementsByTagName('blar').should.eventually.have.length(0)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should find element from another element', function (done) {
|
||||
driver
|
||||
.elementByClassName('border')
|
||||
.elementByXPath('>', './form').should.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should be able to click links', function (done) {
|
||||
driver
|
||||
.elementByLinkText('i am a link').click()
|
||||
.then(function () { return spinTitle('I am another page title', driver); })
|
||||
.nodeify(done);
|
||||
});
|
||||
|
||||
it('should retrieve an element attribute', function (done) {
|
||||
driver
|
||||
.elementById('i_am_an_id')
|
||||
.getAttribute("id").should.become('i_am_an_id')
|
||||
.elementById('i_am_an_id')
|
||||
.getAttribute("blar").should.not.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should retrieve implicit attributes', function (done) {
|
||||
driver
|
||||
.elementsByTagName('option')
|
||||
.then(function (els) {
|
||||
els.should.have.length(3);
|
||||
return els[2].getAttribute('index').should.become('2');
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should retrieve an element text', function (done) {
|
||||
driver
|
||||
.elementById('i_am_an_id').text().should.become('I am a div')
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should check if two elements are equals', function (done) {
|
||||
Q.all([
|
||||
driver.elementById('i_am_an_id'),
|
||||
driver.elementByTagName('div')
|
||||
]).then(function (els) {
|
||||
return els[0].equals(els[1]).should.be.ok;
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should return the page source', function (done) {
|
||||
driver
|
||||
.source()
|
||||
.then(function (source) {
|
||||
source.should.include('<html>');
|
||||
source.should.include('I am a page title');
|
||||
source.should.include('i appear 3 times');
|
||||
source.should.include('</html>');
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should get current url', function (done) {
|
||||
driver
|
||||
.url().should.eventually.include("test/guinea-pig")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should send keystrokes to specific element', function (done) {
|
||||
driver
|
||||
.elementById('comments')
|
||||
.clear()
|
||||
.sendKeys("hello world")
|
||||
.getValue().should.become("hello world")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should send keystrokes to active element', function (done) {
|
||||
driver
|
||||
.elementById('comments')
|
||||
.clear()
|
||||
.click()
|
||||
.keys("hello world")
|
||||
.elementById('comments')
|
||||
.getValue().should.become("hello world")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should clear element', function (done) {
|
||||
driver
|
||||
.elementById('comments')
|
||||
.sendKeys("hello world")
|
||||
.getValue().should.eventually.have.length.above(0)
|
||||
.elementById('comments')
|
||||
.clear()
|
||||
.getValue().should.become("")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should say whether an input is selected', function (done) {
|
||||
driver
|
||||
.elementById('unchecked_checkbox')
|
||||
.selected().should.not.eventually.be.ok
|
||||
.elementById('unchecked_checkbox')
|
||||
.click()
|
||||
.selected().should.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should be able to retrieve css properties', function (done) {
|
||||
driver
|
||||
.elementById('fbemail').getComputedCss('background-color')
|
||||
.should.become("rgba(255, 255, 255, 1)")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should retrieve an element size', function (done) {
|
||||
driver
|
||||
.elementById('i_am_an_id').getSize()
|
||||
.then(function (size) {
|
||||
size.width.should.be.above(0);
|
||||
size.height.should.be.above(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should get location of an element', function (done) {
|
||||
driver
|
||||
.elementById('fbemail')
|
||||
.getLocation()
|
||||
.then(function (loc) {
|
||||
loc.x.should.be.above(0);
|
||||
loc.y.should.be.above(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should retrieve tag name of an element', function (done) {
|
||||
driver
|
||||
.elementById('fbemail').getTagName().should.become("input")
|
||||
.elementByCss("a").getTagName().should.become("a")
|
||||
.nodeify(done);
|
||||
});
|
||||
|
||||
it('should retrieve a window size', function (done) {
|
||||
if (isChrome) return _skip(
|
||||
"only supported on desktop android.", done);
|
||||
driver
|
||||
.getWindowSize()
|
||||
.then(
|
||||
function (size) {
|
||||
size.height.should.be.above(0);
|
||||
size.width.should.be.above(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should move to an arbitrary x-y element and click on it', function (done) {
|
||||
driver.elementByLinkText('i am a link')
|
||||
.moveTo(5, 15)
|
||||
.click()
|
||||
.then(function () { return spinTitle("I am another page title", driver); })
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should submit a form', function (done) {
|
||||
driver
|
||||
.elementById('comments')
|
||||
.sendKeys('This is a comment')
|
||||
.submit()
|
||||
.then(function () {
|
||||
return spinWait(function () {
|
||||
return driver
|
||||
.elementById('your_comments')
|
||||
.text()
|
||||
.should.become('Your comments: This is a comment');
|
||||
});
|
||||
}
|
||||
).nodeify(done);
|
||||
});
|
||||
it('should return true when the element is displayed', function (done) {
|
||||
driver
|
||||
.elementByLinkText('i am a link')
|
||||
.isDisplayed().should.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should return false when the element is not displayed', function (done) {
|
||||
driver
|
||||
.elementById('invisible div')
|
||||
.isDisplayed().should.not.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should return true when the element is enabled', function (done) {
|
||||
driver
|
||||
.elementByLinkText('i am a link')
|
||||
.isEnabled().should.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should return false when the element is not enabled', function (done) {
|
||||
driver
|
||||
.execute("$('#fbemail').attr('disabled', 'disabled');")
|
||||
.elementById('fbemail').isEnabled().should.not.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should return the active element", function (done) {
|
||||
var testText = "hi there";
|
||||
driver
|
||||
.elementById('i_am_a_textbox').sendKeys(testText)
|
||||
.active().getValue().should.become(testText)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should properly navigate to anchor', function (done) {
|
||||
driver
|
||||
.url().then(function (curl) {
|
||||
return driver.get(curl);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to refresh', function (done) {
|
||||
driver.refresh()
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should not display a phishing warning with safariIgnoreFraudWarning', function (done) {
|
||||
if (isChrome) return _skip(
|
||||
"Chrome doesn't test safariIgnoreFraudWarning", done);
|
||||
var titleToBecomeRight = new wd.Asserter(function (driver) {
|
||||
return driver
|
||||
.title()
|
||||
.should.eventually.contain("I am another page title");
|
||||
});
|
||||
driver
|
||||
.get(env.TEST_END_POINT + 'guinea-pig2.html')
|
||||
.waitFor(titleToBecomeRight, 10000, 500)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should be able to get performance logs', function (done) {
|
||||
if (!isChrome) return _skip(
|
||||
"Performance logs aren't available except in Chrome", done);
|
||||
driver
|
||||
.logTypes()
|
||||
.should.eventually.include('performance')
|
||||
.log('performance').then(function (logs) {
|
||||
logs.length.should.be.above(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe('implicit wait', function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
it('should set the implicit wait for finding web elements', function (done) {
|
||||
driver
|
||||
.setImplicitWaitTimeout(7 * 1000)
|
||||
.then(function () {
|
||||
var before = new Date().getTime() / 1000;
|
||||
return driver
|
||||
.elementByTagName('notgonnabethere')
|
||||
.should.be.rejectedWith(/status: 7/)
|
||||
.then(function () {
|
||||
var after = new Date().getTime() / 1000;
|
||||
// commenting this, it doesn't make sense
|
||||
//((after - before) < 9).should.be.ok;
|
||||
((after - before) > 7).should.be.ok;
|
||||
});
|
||||
}).fin(function () {
|
||||
return driver.setImplicitWaitTimeout(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe("execute", function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(driver).nodeify(done);
|
||||
});
|
||||
it("should bubble up javascript errors", function (done) {
|
||||
driver
|
||||
.execute("'nan'--")
|
||||
.should.be.rejectedWith(/status: (13|7)/)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should eval javascript", function (done) {
|
||||
driver
|
||||
.execute("return 1").should.become(1)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should not be returning hardcoded results", function (done) {
|
||||
driver
|
||||
.execute("return 1+1").should.become(2)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should return nothing when you don't explicitly return", function (done) {
|
||||
driver
|
||||
.execute("1+1")
|
||||
.should.not.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should execute code inside the web view", function (done) {
|
||||
driver
|
||||
.execute('return document.body.innerHTML.indexOf(' +
|
||||
'"I am some page content") > 0')
|
||||
.should.eventually.be.ok
|
||||
.execute('return document.body.innerHTML.indexOf(' +
|
||||
'"I am not some page content") > 0')
|
||||
.should.not.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should convert selenium element arg to webview element', function (done) {
|
||||
driver
|
||||
.elementById('useragent')
|
||||
.then(function (el) {
|
||||
return driver.execute(
|
||||
'return arguments[0].scrollIntoView(true);',
|
||||
[{'ELEMENT': el.value}]);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should catch stale or undefined element as arg', function (done) {
|
||||
driver
|
||||
.elementById('useragent')
|
||||
.then(function (el) {
|
||||
return driver.execute(
|
||||
'return arguments[0].scrollIntoView(true);',
|
||||
[{'ELEMENT': (el.value + 1)}]
|
||||
).should.beRejected;
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to return multiple elements from javascript', function (done) {
|
||||
driver
|
||||
.execute('return document.getElementsByTagName("a");')
|
||||
.then(function (res) {
|
||||
res[0].value.should.exist;
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe("executeAsync", function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(driver).nodeify(done);
|
||||
});
|
||||
it("should bubble up javascript errors", function (done) {
|
||||
if (isChrome) return _skip(
|
||||
"executeAsync not working on android.", done);
|
||||
driver
|
||||
.executeAsync("'nan'--")
|
||||
.should.be.rejectedWith(/status: 13/)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should execute async javascript", function (done) {
|
||||
if (isChrome) return _skip(
|
||||
"executeAsync not working on android.", done);
|
||||
driver
|
||||
.setAsyncScriptTimeout('10000')
|
||||
.executeAsync("arguments[arguments.length - 1](123);")
|
||||
.should.become(123)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should timeout when callback isn't invoked", function (done) {
|
||||
if (isChrome) return _skip(
|
||||
"executeAsync not working on android.", done);
|
||||
driver
|
||||
.setAsyncScriptTimeout('2000')
|
||||
.executeAsync("return 1 + 2")
|
||||
.should.be.rejectedWith(/status: 28/)
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe('alerts', function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(driver).nodeify(done);
|
||||
});
|
||||
it('should accept alert', function (done) {
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.acceptAlert()
|
||||
.title().should.eventually.include("I am a page title")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should dismiss alert', function (done) {
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.dismissAlert()
|
||||
.title().should.eventually.include("I am a page title")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should get text of alert', function (done) {
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.alertText().should.eventually.include("I am an alert")
|
||||
.dismissAlert()
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should not get text of alert that closed', function (done) {
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.acceptAlert()
|
||||
.alertText()
|
||||
.should.be.rejectedWith(/status: 27/)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should set text of prompt', function (done) {
|
||||
driver
|
||||
.elementById('prompt1').click()
|
||||
.alertKeys("yes I do!")
|
||||
.acceptAlert()
|
||||
.elementById('promptVal').getValue().should.become("yes I do!")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should fail to set text of alert', function (done) {
|
||||
if (isChrome) return _skip(
|
||||
"doesn't throw on android.", done);
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.alertKeys("yes I do!")
|
||||
.should.be.rejectedWith(/status: 11/)
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe('frames', function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(driver, testEndpoint + 'frameset.html',
|
||||
"Frameset guinea pig").frame()
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to frame by name', function (done) {
|
||||
driver
|
||||
.frame("first")
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 1")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to frame by index', function (done) {
|
||||
driver
|
||||
.frame(1)
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 2")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to frame by id', function (done) {
|
||||
driver
|
||||
.frame("frame3")
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 3")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch back to default content from frame', function (done) {
|
||||
driver
|
||||
.frame("first")
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 1")
|
||||
.frame(null)
|
||||
.elementByTagName('frameset').should.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to child frames', function (done) {
|
||||
driver
|
||||
.frame("third")
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.frame("childframe")
|
||||
.elementById("only_on_page_2").should.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should execute javascript in frame', function (done) {
|
||||
driver.frame("first")
|
||||
.execute("return document.getElementsByTagName('h1')[0].innerHTML;")
|
||||
.should.become("Sub frame 1")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should execute async javascript in frame', function (done) {
|
||||
driver.frame("first")
|
||||
.executeAsync("arguments[arguments.length - 1](" +
|
||||
"document.getElementsByTagName('h1')[0].innerHTML);")
|
||||
.should.become("Sub frame 1")
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe('iframes', function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(driver, testEndpoint + 'iframes.html',
|
||||
"Iframe guinea pig").frame()
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to iframe by name', function (done) {
|
||||
driver
|
||||
.frame("iframe1")
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 1")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to iframe by index', function (done) {
|
||||
driver
|
||||
.frame(1)
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 2")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to iframe by id', function (done) {
|
||||
driver
|
||||
.frame("id-iframe3")
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 3")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to iframe by element', function (done) {
|
||||
driver
|
||||
.elementById('id-iframe3')
|
||||
.then(function (frame) {
|
||||
return driver
|
||||
.frame(frame)
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 3");
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should not switch to iframe by element of wrong type', function (done) {
|
||||
driver
|
||||
.elementByTagName('h1')
|
||||
.then(function (h1) {
|
||||
return driver.frame(h1)
|
||||
.should.be.rejectedWith(/status: 8/);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should switch back to default content from iframe', function (done) {
|
||||
driver
|
||||
.frame("iframe1")
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 1")
|
||||
.frame(null)
|
||||
.elementsByTagName('iframe')
|
||||
.should.eventually.have.length(3)
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe('cookies', function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
|
||||
describe('within iframe webview', function () {
|
||||
it('should be able to get cookies for a page with none', function (done) {
|
||||
loadWebView(driver, testEndpoint + 'iframes.html',
|
||||
"Iframe guinea pig").then(function () {
|
||||
return driver.allCookies().should.eventually.have.length(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
describe('within webview', function () {
|
||||
function _ignoreEncodingBug(value) {
|
||||
if (isChrome) {
|
||||
console.warn('Going round android bug: whitespace in cookies.');
|
||||
return encodeURI(value);
|
||||
} else return value;
|
||||
}
|
||||
beforeEach(function (done) {
|
||||
loadWebView(driver).nodeify(done);
|
||||
});
|
||||
it('should be able to get cookies for a page', function (done) {
|
||||
driver
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
cookies.length.should.equal(2);
|
||||
cookies[0].name.should.equal("guineacookie1");
|
||||
cookies[0].value.should.equal(_ignoreEncodingBug("i am a cookie value"));
|
||||
cookies[1].name.should.equal("guineacookie2");
|
||||
cookies[1].value.should.equal(_ignoreEncodingBug("cookié2"));
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to set a cookie for a page', function (done) {
|
||||
var newCookie = {name: "newcookie", value: "i'm new here"};
|
||||
driver
|
||||
.deleteCookie(newCookie.name)
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.setCookie(newCookie)
|
||||
.allCookies();
|
||||
})
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.include(newCookie.value);
|
||||
// should not clobber old cookies
|
||||
_.pluck(cookies, 'name').should.include("guineacookie1");
|
||||
_.pluck(cookies, 'value').should.include(_ignoreEncodingBug("i am a cookie value"));
|
||||
})
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should be able to set a cookie with expiry', function (done) {
|
||||
var newCookie = {name: "newcookie", value: "i'm new here"};
|
||||
var now = parseInt(Date.now() / 1000, 10);
|
||||
newCookie.expiry = now - 1000; // set cookie in past
|
||||
driver
|
||||
.deleteCookie(newCookie.name)
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
})
|
||||
.then(function () {
|
||||
return driver
|
||||
.setCookie(newCookie)
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
// should not include cookie we just added because of expiry
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
// should not clobber old cookies
|
||||
_.pluck(cookies, 'name').should.include("guineacookie1");
|
||||
_.pluck(cookies, 'value').should.include(_ignoreEncodingBug("i am a cookie value"));
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to delete one cookie', function (done) {
|
||||
var newCookie = {name: "newcookie", value: "i'm new here"};
|
||||
driver
|
||||
.deleteCookie(newCookie.name)
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.setCookie(newCookie)
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.deleteCookie('newcookie')
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to delete all cookie', function (done) {
|
||||
var newCookie = {name: "newcookie", value: "i'm new here"};
|
||||
driver
|
||||
.deleteCookie(newCookie.name)
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.setCookie(newCookie)
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.deleteAllCookies()
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
if (app === "iwebview") {
|
||||
describe('https', function () {
|
||||
var driver;
|
||||
setup(this).then(function (d) { driver = d; });
|
||||
it('should be able to test self-signed pages', function (done) {
|
||||
loadWebView(driver, 'https://selfsigned.buildslave.saucelabs.com',
|
||||
"Sauce Labs")
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
65
test/functional/common/webview/alerts-base.js
Normal file
65
test/functional/common/webview/alerts-base.js
Normal file
@@ -0,0 +1,65 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView,
|
||||
isChrome = webviewHelper.isChrome,
|
||||
skip = webviewHelper.skip;
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe('alerts', function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(desired, driver).nodeify(done);
|
||||
});
|
||||
it('should accept alert', function (done) {
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.acceptAlert()
|
||||
.title().should.eventually.include("I am a page title")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should dismiss alert', function (done) {
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.dismissAlert()
|
||||
.title().should.eventually.include("I am a page title")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should get text of alert', function (done) {
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.alertText().should.eventually.include("I am an alert")
|
||||
.dismissAlert()
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should not get text of alert that closed', function (done) {
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.acceptAlert()
|
||||
.alertText()
|
||||
.should.be.rejectedWith(/status: 27/)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should set text of prompt', function (done) {
|
||||
driver
|
||||
.elementById('prompt1').click()
|
||||
.alertKeys("yes I do!")
|
||||
.acceptAlert()
|
||||
.elementById('promptVal').getValue().should.become("yes I do!")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should fail to set text of alert', function (done) {
|
||||
if (isChrome(desired)) return skip(
|
||||
"doesn't throw on android.", done);
|
||||
driver
|
||||
.elementById('alert1').click()
|
||||
.alertKeys("yes I do!")
|
||||
.should.be.rejectedWith(/status: 11/)
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
};
|
||||
260
test/functional/common/webview/basics-base.js
Normal file
260
test/functional/common/webview/basics-base.js
Normal file
@@ -0,0 +1,260 @@
|
||||
"use strict";
|
||||
|
||||
var env = require('../../../helpers/env'),
|
||||
setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView,
|
||||
isChrome = webviewHelper.isChrome,
|
||||
Asserter = require('wd').Asserter,
|
||||
Q = require('q'),
|
||||
spinTitle = webviewHelper.spinTitle,
|
||||
spinWait = require('../../../helpers/spin.js').spinWait,
|
||||
skip = webviewHelper.skip;
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe('basics', function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(desired, driver).nodeify(done);
|
||||
});
|
||||
it('should find a web element in the web view', function (done) {
|
||||
driver
|
||||
.elementById('i_am_an_id').should.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should find multiple web elements in the web view', function (done) {
|
||||
driver
|
||||
.elementsByTagName('a').should.eventually.have.length.above(0)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should fail gracefully to find multiple missing web elements in the web view', function (done) {
|
||||
driver
|
||||
.elementsByTagName('blar').should.eventually.have.length(0)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should find element from another element', function (done) {
|
||||
driver
|
||||
.elementByClassName('border')
|
||||
.elementByXPath('>', './form').should.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should be able to click links', function (done) {
|
||||
driver
|
||||
.elementByLinkText('i am a link').click()
|
||||
.then(function () { return spinTitle('I am another page title', driver); })
|
||||
.nodeify(done);
|
||||
});
|
||||
|
||||
it('should retrieve an element attribute', function (done) {
|
||||
driver
|
||||
.elementById('i_am_an_id')
|
||||
.getAttribute("id").should.become('i_am_an_id')
|
||||
.elementById('i_am_an_id')
|
||||
.getAttribute("blar").should.not.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should retrieve implicit attributes', function (done) {
|
||||
driver
|
||||
.elementsByTagName('option')
|
||||
.then(function (els) {
|
||||
els.should.have.length(3);
|
||||
return els[2].getAttribute('index').should.become('2');
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should retrieve an element text', function (done) {
|
||||
driver
|
||||
.elementById('i_am_an_id').text().should.become('I am a div')
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should check if two elements are equals', function (done) {
|
||||
Q.all([
|
||||
driver.elementById('i_am_an_id'),
|
||||
driver.elementByTagName('div')
|
||||
]).then(function (els) {
|
||||
return els[0].equals(els[1]).should.be.ok;
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should return the page source', function (done) {
|
||||
driver
|
||||
.source()
|
||||
.then(function (source) {
|
||||
source.should.include('<html>');
|
||||
source.should.include('I am a page title');
|
||||
source.should.include('i appear 3 times');
|
||||
source.should.include('</html>');
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should get current url', function (done) {
|
||||
driver
|
||||
.url().should.eventually.include("test/guinea-pig")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should send keystrokes to specific element', function (done) {
|
||||
driver
|
||||
.elementById('comments')
|
||||
.clear()
|
||||
.sendKeys("hello world")
|
||||
.getValue().should.become("hello world")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should send keystrokes to active element', function (done) {
|
||||
driver
|
||||
.elementById('comments')
|
||||
.clear()
|
||||
.click()
|
||||
.keys("hello world")
|
||||
.elementById('comments')
|
||||
.getValue().should.become("hello world")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should clear element', function (done) {
|
||||
driver
|
||||
.elementById('comments')
|
||||
.sendKeys("hello world")
|
||||
.getValue().should.eventually.have.length.above(0)
|
||||
.elementById('comments')
|
||||
.clear()
|
||||
.getValue().should.become("")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should say whether an input is selected', function (done) {
|
||||
driver
|
||||
.elementById('unchecked_checkbox')
|
||||
.selected().should.not.eventually.be.ok
|
||||
.elementById('unchecked_checkbox')
|
||||
.click()
|
||||
.selected().should.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should be able to retrieve css properties', function (done) {
|
||||
driver
|
||||
.elementById('fbemail').getComputedCss('background-color')
|
||||
.should.become("rgba(255, 255, 255, 1)")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should retrieve an element size', function (done) {
|
||||
driver
|
||||
.elementById('i_am_an_id').getSize()
|
||||
.then(function (size) {
|
||||
size.width.should.be.above(0);
|
||||
size.height.should.be.above(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should get location of an element', function (done) {
|
||||
driver
|
||||
.elementById('fbemail')
|
||||
.getLocation()
|
||||
.then(function (loc) {
|
||||
loc.x.should.be.above(0);
|
||||
loc.y.should.be.above(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should retrieve tag name of an element', function (done) {
|
||||
driver
|
||||
.elementById('fbemail').getTagName().should.become("input")
|
||||
.elementByCss("a").getTagName().should.become("a")
|
||||
.nodeify(done);
|
||||
});
|
||||
|
||||
it('should retrieve a window size', function (done) {
|
||||
if (isChrome(desired)) return skip(
|
||||
"only supported on desktop android.", done);
|
||||
driver
|
||||
.getWindowSize()
|
||||
.then(
|
||||
function (size) {
|
||||
size.height.should.be.above(0);
|
||||
size.width.should.be.above(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should move to an arbitrary x-y element and click on it', function (done) {
|
||||
driver.elementByLinkText('i am a link')
|
||||
.moveTo(5, 15)
|
||||
.click()
|
||||
.then(function () { return spinTitle("I am another page title", driver); })
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should submit a form', function (done) {
|
||||
driver
|
||||
.elementById('comments')
|
||||
.sendKeys('This is a comment')
|
||||
.submit()
|
||||
.then(function () {
|
||||
return spinWait(function () {
|
||||
return driver
|
||||
.elementById('your_comments')
|
||||
.text()
|
||||
.should.become('Your comments: This is a comment');
|
||||
});
|
||||
}
|
||||
).nodeify(done);
|
||||
});
|
||||
it('should return true when the element is displayed', function (done) {
|
||||
driver
|
||||
.elementByLinkText('i am a link')
|
||||
.isDisplayed().should.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should return false when the element is not displayed', function (done) {
|
||||
driver
|
||||
.elementById('invisible div')
|
||||
.isDisplayed().should.not.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should return true when the element is enabled', function (done) {
|
||||
driver
|
||||
.elementByLinkText('i am a link')
|
||||
.isEnabled().should.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should return false when the element is not enabled', function (done) {
|
||||
driver
|
||||
.execute("$('#fbemail').attr('disabled', 'disabled');")
|
||||
.elementById('fbemail').isEnabled().should.not.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should return the active element", function (done) {
|
||||
var testText = "hi there";
|
||||
driver
|
||||
.elementById('i_am_a_textbox').sendKeys(testText)
|
||||
.active().getValue().should.become(testText)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should properly navigate to anchor', function (done) {
|
||||
driver
|
||||
.url().then(function (curl) {
|
||||
return driver.get(curl);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to refresh', function (done) {
|
||||
driver.refresh()
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should not display a phishing warning with safariIgnoreFraudWarning', function (done) {
|
||||
if (isChrome(desired)) return skip(
|
||||
"Chrome doesn't test safariIgnoreFraudWarning", done);
|
||||
var titleToBecomeRight = new Asserter(function (driver) {
|
||||
return driver
|
||||
.title()
|
||||
.should.eventually.contain("I am another page title");
|
||||
});
|
||||
driver
|
||||
.get(env.TEST_END_POINT + 'guinea-pig2.html')
|
||||
.waitFor(titleToBecomeRight, 10000, 500)
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should be able to get performance logs', function (done) {
|
||||
if (!isChrome(desired)) return skip(
|
||||
"Performance logs aren't available except in Chrome", done);
|
||||
driver
|
||||
.logTypes()
|
||||
.should.eventually.include('performance')
|
||||
.log('performance').then(function (logs) {
|
||||
logs.length.should.be.above(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
};
|
||||
141
test/functional/common/webview/cookies-base.js
Normal file
141
test/functional/common/webview/cookies-base.js
Normal file
@@ -0,0 +1,141 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView,
|
||||
isChrome = webviewHelper.isChrome,
|
||||
testEndpoint = webviewHelper.testEndpoint,
|
||||
_ = require('underscore');
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe('cookies', function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
describe('within iframe webview', function () {
|
||||
it('should be able to get cookies for a page with none', function (done) {
|
||||
loadWebView(desired, driver, testEndpoint(desired) + 'iframes.html',
|
||||
"Iframe guinea pig").then(function () {
|
||||
return driver.allCookies().should.eventually.have.length(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
describe('within webview', function () {
|
||||
function _ignoreEncodingBug(value) {
|
||||
if (isChrome) {
|
||||
console.warn('Going round android bug: whitespace in cookies.');
|
||||
return encodeURI(value);
|
||||
} else return value;
|
||||
}
|
||||
beforeEach(function (done) {
|
||||
loadWebView(desired, driver).nodeify(done);
|
||||
});
|
||||
it('should be able to get cookies for a page', function (done) {
|
||||
driver
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
cookies.length.should.equal(2);
|
||||
cookies[0].name.should.equal("guineacookie1");
|
||||
cookies[0].value.should.equal(_ignoreEncodingBug("i am a cookie value"));
|
||||
cookies[1].name.should.equal("guineacookie2");
|
||||
cookies[1].value.should.equal(_ignoreEncodingBug("cookié2"));
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to set a cookie for a page', function (done) {
|
||||
var newCookie = {name: "newcookie", value: "i'm new here"};
|
||||
driver
|
||||
.deleteCookie(newCookie.name)
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.setCookie(newCookie)
|
||||
.allCookies();
|
||||
})
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.include(newCookie.value);
|
||||
// should not clobber old cookies
|
||||
_.pluck(cookies, 'name').should.include("guineacookie1");
|
||||
_.pluck(cookies, 'value').should.include(_ignoreEncodingBug("i am a cookie value"));
|
||||
})
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should be able to set a cookie with expiry', function (done) {
|
||||
var newCookie = {name: "newcookie", value: "i'm new here"};
|
||||
var now = parseInt(Date.now() / 1000, 10);
|
||||
newCookie.expiry = now - 1000; // set cookie in past
|
||||
driver
|
||||
.deleteCookie(newCookie.name)
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
})
|
||||
.then(function () {
|
||||
return driver
|
||||
.setCookie(newCookie)
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
// should not include cookie we just added because of expiry
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
// should not clobber old cookies
|
||||
_.pluck(cookies, 'name').should.include("guineacookie1");
|
||||
_.pluck(cookies, 'value').should.include(_ignoreEncodingBug("i am a cookie value"));
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to delete one cookie', function (done) {
|
||||
var newCookie = {name: "newcookie", value: "i'm new here"};
|
||||
driver
|
||||
.deleteCookie(newCookie.name)
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.setCookie(newCookie)
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.deleteCookie('newcookie')
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to delete all cookie', function (done) {
|
||||
var newCookie = {name: "newcookie", value: "i'm new here"};
|
||||
driver
|
||||
.deleteCookie(newCookie.name)
|
||||
.allCookies()
|
||||
.then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.setCookie(newCookie)
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.include(newCookie.value);
|
||||
}).then(function () {
|
||||
return driver
|
||||
.deleteAllCookies()
|
||||
.allCookies();
|
||||
}).then(function (cookies) {
|
||||
_.pluck(cookies, 'name').should.not.include(newCookie.name);
|
||||
_.pluck(cookies, 'value').should.not.include(newCookie.value);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
45
test/functional/common/webview/execute-async-base.js
Normal file
45
test/functional/common/webview/execute-async-base.js
Normal file
@@ -0,0 +1,45 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView,
|
||||
isChrome = webviewHelper.isChrome,
|
||||
skip = webviewHelper.skip;
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe("executeAsync", function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(desired, driver).nodeify(done);
|
||||
});
|
||||
it("should bubble up javascript errors", function (done) {
|
||||
if (isChrome(desired)) return skip(
|
||||
"executeAsync not working on android.", done);
|
||||
driver
|
||||
.executeAsync("'nan'--")
|
||||
.should.be.rejectedWith(/status: 13/)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should execute async javascript", function (done) {
|
||||
if (isChrome(desired)) return skip(
|
||||
"executeAsync not working on android.", done);
|
||||
driver
|
||||
.setAsyncScriptTimeout('10000')
|
||||
.executeAsync("arguments[arguments.length - 1](123);")
|
||||
.should.become(123)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should timeout when callback isn't invoked", function (done) {
|
||||
if (isChrome(desired)) return skip(
|
||||
"executeAsync not working on android.", done);
|
||||
driver
|
||||
.setAsyncScriptTimeout('2000')
|
||||
.executeAsync("return 1 + 2")
|
||||
.should.be.rejectedWith(/status: 28/)
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
};
|
||||
75
test/functional/common/webview/execute-base.js
Normal file
75
test/functional/common/webview/execute-base.js
Normal file
@@ -0,0 +1,75 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView;
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe("execute", function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(desired, driver).nodeify(done);
|
||||
});
|
||||
it("should bubble up javascript errors", function (done) {
|
||||
driver
|
||||
.execute("'nan'--")
|
||||
.should.be.rejectedWith(/status: (13|7)/)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should eval javascript", function (done) {
|
||||
driver
|
||||
.execute("return 1").should.become(1)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should not be returning hardcoded results", function (done) {
|
||||
driver
|
||||
.execute("return 1+1").should.become(2)
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should return nothing when you don't explicitly return", function (done) {
|
||||
driver
|
||||
.execute("1+1")
|
||||
.should.not.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it("should execute code inside the web view", function (done) {
|
||||
driver
|
||||
.execute('return document.body.innerHTML.indexOf(' +
|
||||
'"I am some page content") > 0')
|
||||
.should.eventually.be.ok
|
||||
.execute('return document.body.innerHTML.indexOf(' +
|
||||
'"I am not some page content") > 0')
|
||||
.should.not.eventually.be.ok
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should convert selenium element arg to webview element', function (done) {
|
||||
driver
|
||||
.elementById('useragent')
|
||||
.then(function (el) {
|
||||
return driver.execute(
|
||||
'return arguments[0].scrollIntoView(true);',
|
||||
[{'ELEMENT': el.value}]);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should catch stale or undefined element as arg', function (done) {
|
||||
driver
|
||||
.elementById('useragent')
|
||||
.then(function (el) {
|
||||
return driver.execute(
|
||||
'return arguments[0].scrollIntoView(true);',
|
||||
[{'ELEMENT': (el.value + 1)}]
|
||||
).should.beRejected;
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should be able to return multiple elements from javascript', function (done) {
|
||||
driver
|
||||
.execute('return document.getElementsByTagName("a");')
|
||||
.then(function (res) {
|
||||
res[0].value.should.exist;
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
};
|
||||
71
test/functional/common/webview/frames-base.js
Normal file
71
test/functional/common/webview/frames-base.js
Normal file
@@ -0,0 +1,71 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView,
|
||||
testEndpoint = webviewHelper.testEndpoint;
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe('frames', function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(desired, driver, testEndpoint(desired) + 'frameset.html',
|
||||
"Frameset guinea pig").frame()
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to frame by name', function (done) {
|
||||
driver
|
||||
.frame("first")
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 1")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to frame by index', function (done) {
|
||||
driver
|
||||
.frame(1)
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 2")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to frame by id', function (done) {
|
||||
driver
|
||||
.frame("frame3")
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 3")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch back to default content from frame', function (done) {
|
||||
driver
|
||||
.frame("first")
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 1")
|
||||
.frame(null)
|
||||
.elementByTagName('frameset').should.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to child frames', function (done) {
|
||||
driver
|
||||
.frame("third")
|
||||
.title().should.become("Frameset guinea pig")
|
||||
.frame("childframe")
|
||||
.elementById("only_on_page_2").should.eventually.exist
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should execute javascript in frame', function (done) {
|
||||
driver.frame("first")
|
||||
.execute("return document.getElementsByTagName('h1')[0].innerHTML;")
|
||||
.should.become("Sub frame 1")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should execute async javascript in frame', function (done) {
|
||||
driver.frame("first")
|
||||
.executeAsync("arguments[arguments.length - 1](" +
|
||||
"document.getElementsByTagName('h1')[0].innerHTML);")
|
||||
.should.become("Sub frame 1")
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
};
|
||||
20
test/functional/common/webview/https-base.js
Normal file
20
test/functional/common/webview/https-base.js
Normal file
@@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView;
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
if (desired.app === "iwebview") {
|
||||
describe('https', function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
it('should be able to test self-signed pages', function (done) {
|
||||
loadWebView(desired, driver, 'https://selfsigned.buildslave.saucelabs.com',
|
||||
"Sauce Labs")
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
69
test/functional/common/webview/iframes-base.js
Normal file
69
test/functional/common/webview/iframes-base.js
Normal file
@@ -0,0 +1,69 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView,
|
||||
testEndpoint = webviewHelper.testEndpoint;
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe('iframes', function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(desired, driver, testEndpoint(desired) + 'iframes.html',
|
||||
"Iframe guinea pig").frame()
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to iframe by name', function (done) {
|
||||
driver
|
||||
.frame("iframe1")
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 1")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to iframe by index', function (done) {
|
||||
driver
|
||||
.frame(1)
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 2")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to iframe by id', function (done) {
|
||||
driver
|
||||
.frame("id-iframe3")
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 3")
|
||||
.nodeify(done);
|
||||
});
|
||||
it('should switch to iframe by element', function (done) {
|
||||
driver
|
||||
.elementById('id-iframe3')
|
||||
.then(function (frame) {
|
||||
return driver
|
||||
.frame(frame)
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 3");
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should not switch to iframe by element of wrong type', function (done) {
|
||||
driver
|
||||
.elementByTagName('h1')
|
||||
.then(function (h1) {
|
||||
return driver.frame(h1)
|
||||
.should.be.rejectedWith(/status: 8/);
|
||||
}).nodeify(done);
|
||||
});
|
||||
it('should switch back to default content from iframe', function (done) {
|
||||
driver
|
||||
.frame("iframe1")
|
||||
.title().should.become("Iframe guinea pig")
|
||||
.elementByTagName("h1").text().should.become("Sub frame 1")
|
||||
.frame(null)
|
||||
.elementsByTagName('iframe')
|
||||
.should.eventually.have.length(3)
|
||||
.nodeify(done);
|
||||
});
|
||||
});
|
||||
};
|
||||
30
test/functional/common/webview/implicit-wait-base.js
Normal file
30
test/functional/common/webview/implicit-wait-base.js
Normal file
@@ -0,0 +1,30 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base");
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe('implicit wait', function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
it('should set the implicit wait for finding web elements', function (done) {
|
||||
driver
|
||||
.setImplicitWaitTimeout(7 * 1000)
|
||||
.then(function () {
|
||||
var before = new Date().getTime() / 1000;
|
||||
return driver
|
||||
.elementByTagName('notgonnabethere')
|
||||
.should.be.rejectedWith(/status: 7/)
|
||||
.then(function () {
|
||||
var after = new Date().getTime() / 1000;
|
||||
// commenting this, it doesn't make sense
|
||||
//((after - before) < 9).should.be.ok;
|
||||
((after - before) > 7).should.be.ok;
|
||||
});
|
||||
}).fin(function () {
|
||||
return driver.setImplicitWaitTimeout(0);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
};
|
||||
31
test/functional/common/webview/window-title-base.js
Normal file
31
test/functional/common/webview/window-title-base.js
Normal file
@@ -0,0 +1,31 @@
|
||||
"use strict";
|
||||
|
||||
var setup = require("../setup-base"),
|
||||
webviewHelper = require("../../../helpers/webview"),
|
||||
loadWebView = webviewHelper.loadWebView,
|
||||
isChrome = webviewHelper.isChrome;
|
||||
|
||||
module.exports = function (desired) {
|
||||
|
||||
describe('window title', function () {
|
||||
var driver;
|
||||
setup(this, desired, {'no-reset': true}).then(function (d) { driver = d; });
|
||||
|
||||
beforeEach(function (done) {
|
||||
loadWebView(desired, driver).nodeify(done);
|
||||
});
|
||||
it('should return a valid title on web view', function (done) {
|
||||
driver
|
||||
.title().should.eventually.include("I am a page title")
|
||||
.then(function () {
|
||||
if (isChrome(desired)) {
|
||||
return;
|
||||
}
|
||||
return driver
|
||||
.execute("mobile: leaveWebView")
|
||||
.title()
|
||||
.should.be.rejectedWith(/status: 13/);
|
||||
}).nodeify(done);
|
||||
});
|
||||
});
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
describe('iwebview @skip-ios-all @skip-ci', function () {
|
||||
// TODO: webview tests need to be refactored before ci is enabled
|
||||
var app = 'iwebview';
|
||||
require('../common/webview-base')(app);
|
||||
});
|
||||
6
test/functional/ios/iwebview/alerts-specs.js
Normal file
6
test/functional/ios/iwebview/alerts-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/alerts-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/iwebview/basics-specs.js
Normal file
6
test/functional/ios/iwebview/basics-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/basics-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/iwebview/cookies-specs.js
Normal file
6
test/functional/ios/iwebview/cookies-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/cookies-base')(desired);
|
||||
});
|
||||
4
test/functional/ios/iwebview/desired.js
Normal file
4
test/functional/ios/iwebview/desired.js
Normal file
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
nativeWebTap: true,
|
||||
app: 'iwebview'
|
||||
};
|
||||
6
test/functional/ios/iwebview/execute-async-specs.js
Normal file
6
test/functional/ios/iwebview/execute-async-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/execute-async-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/iwebview/execute-specs.js
Normal file
6
test/functional/ios/iwebview/execute-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/execute-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/iwebview/frames-specs.js
Normal file
6
test/functional/ios/iwebview/frames-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/frames-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/iwebview/https-specs.js
Normal file
6
test/functional/ios/iwebview/https-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/https-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/iwebview/iframes-specs.js
Normal file
6
test/functional/ios/iwebview/iframes-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/iframes-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/iwebview/implicit-wait-specs.js
Normal file
6
test/functional/ios/iwebview/implicit-wait-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/implicit-wait-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/iwebview/window-title-specs.js
Normal file
6
test/functional/ios/iwebview/window-title-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("iwebview @skip-ios-all", function () {
|
||||
require('../../common/webview/window-title-base')(desired);
|
||||
});
|
||||
@@ -1,6 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
describe('safari - webview @skip-ci', function () {
|
||||
// TODO: enable safari/webview tests on ci
|
||||
require('../../common/webview-base')('safari');
|
||||
});
|
||||
6
test/functional/ios/safari/webview/alerts-specs.js
Normal file
6
test/functional/ios/safari/webview/alerts-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/alerts-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/safari/webview/basics-specs.js
Normal file
6
test/functional/ios/safari/webview/basics-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/basics-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/safari/webview/cookies-specs.js
Normal file
6
test/functional/ios/safari/webview/cookies-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/cookies-base')(desired);
|
||||
});
|
||||
5
test/functional/ios/safari/webview/desired.js
Normal file
5
test/functional/ios/safari/webview/desired.js
Normal file
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
nativeWebTap: true,
|
||||
browserName: 'safari',
|
||||
safariIgnoreFraudWarning: true
|
||||
};
|
||||
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/execute-async-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/safari/webview/execute-specs.js
Normal file
6
test/functional/ios/safari/webview/execute-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/execute-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/safari/webview/frames-specs.js
Normal file
6
test/functional/ios/safari/webview/frames-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/frames-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/safari/webview/iframes-specs.js
Normal file
6
test/functional/ios/safari/webview/iframes-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/iframes-base')(desired);
|
||||
});
|
||||
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/implicit-wait-base')(desired);
|
||||
});
|
||||
6
test/functional/ios/safari/webview/window-title-specs.js
Normal file
6
test/functional/ios/safari/webview/window-title-specs.js
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
var desired = require('./desired');
|
||||
|
||||
describe("safari - webview", function () {
|
||||
require('../../../common/webview/window-title-base')(desired);
|
||||
});
|
||||
@@ -18,7 +18,9 @@ var spinTitle = function (expTitle, browser, _timeout) {
|
||||
});
|
||||
};
|
||||
|
||||
var loadWebView = function (app, browser, urlToLoad, titleToSpin) {
|
||||
var loadWebView = function (desired, browser, urlToLoad, titleToSpin) {
|
||||
var app = typeof desired === 'object' ? desired.app || desired.browserName : desired;
|
||||
|
||||
var uuid = uuidGenerator.v1();
|
||||
if (typeof urlToLoad === "undefined") {
|
||||
if (app === "chrome" || app === "chromium") {
|
||||
@@ -55,7 +57,24 @@ var loadWebView = function (app, browser, urlToLoad, titleToSpin) {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
var isChrome = function (desired) {
|
||||
return desired.app === "chrome" || desired.app === "chromium";
|
||||
};
|
||||
|
||||
function skip(reason, done) {
|
||||
console.warn("skipping: " + reason);
|
||||
done();
|
||||
}
|
||||
|
||||
var testEndpoint = function (desired) {
|
||||
return isChrome(desired) ? env.CHROME_TEST_END_POINT : env.TEST_END_POINT;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
spinTitle: spinTitle,
|
||||
loadWebView: loadWebView
|
||||
loadWebView: loadWebView,
|
||||
isChrome: isChrome,
|
||||
skip: skip,
|
||||
testEndpoint: testEndpoint
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user