appium-xcuitest-driver-conan
Version:
Appium driver for iOS using XCUITest for backend
148 lines (127 loc) • 4.14 kB
JavaScript
import { errors, isErrorType } from 'appium-base-driver';
let commands = {}, helpers = {}, extensions = {};
commands.getAlertText = async function () {
try {
let method = 'GET';
let endpoint = `/alert/text`;
return await this.proxyCommand(endpoint, method);
} catch (err) {
if (!this.isWebContext()) {
throw err;
}
let alert = await this.getAlert();
let text = await alert.getText();
return text;
}
};
// TODO: WDA does not currently support this natively
commands.setAlertText = async function (text) {
if (!Array.isArray(text)) {
text = text.split('');
}
try {
let method = 'POST';
let endpoint = `/alert/text`;
return await this.proxyCommand(endpoint, method, text);
} catch (err) {
if (!this.isWebContext()) {
throw err;
}
let alert = await this.getAlert();
await alert.setText(text);
return;
}
};
commands.postAcceptAlert = async function () {
try {
let method = 'POST';
let endpoint = `/alert/accept`;
return await this.proxyCommand(endpoint, method);
} catch (err) {
if (!this.isWebContext()) {
throw err;
}
let alert = await this.getAlert();
if (alert.close) {
await alert.close();
} else {
await alert.ok();
}
return;
}
};
commands.postDismissAlert = async function () {
try {
let method = 'POST';
let endpoint = `/alert/dismiss`;
return await this.proxyCommand(endpoint, method);
} catch (err) {
if (!this.isWebContext()) {
throw err;
}
let alert = await this.getAlert();
if (alert.close) {
await alert.close();
} else {
await alert.cancel();
}
return;
}
};
helpers.getAlert = async function () {
let possibleAlert = await this.findNativeElementOrElements('class name', 'XCUIElementTypeScrollView', true);
if (possibleAlert.length !== 1) {
throw new errors.NoAlertOpenError();
}
let possibleAlertButtons = await this.findNativeElementOrElements('class name', 'XCUIElementTypeButton', true, possibleAlert[0].ELEMENT);
if (possibleAlertButtons.length < 1 || possibleAlertButtons.length > 2) {
throw new errors.NoAlertOpenError();
}
let assertButtonName = async (button, expectedName) => {
button = button.ELEMENT ? button.ELEMENT : button;
let name = await this.proxyCommand(`/element/${button}/attribute/name`, 'GET');
if (name.toLowerCase() !== expectedName) {
throw new errors.NoAlertOpenError();
}
};
let alert = possibleAlert[0];
if (possibleAlertButtons.length === 1) {
// make sure the button is 'Close'
let closeButton = possibleAlertButtons[0];
await assertButtonName(closeButton, 'close');
alert.close = async () => {
await this.proxyCommand(`/element/${closeButton.ELEMENT}/click`, 'POST');
};
} else {
// ensure the buttons are 'Cancel' and 'OK'
let cancelButton = possibleAlertButtons[0];
await assertButtonName(cancelButton, 'cancel');
let okButton = possibleAlertButtons[1];
await assertButtonName(okButton, 'ok');
alert.cancel = async () => {
await this.proxyCommand(`/element/${cancelButton.ELEMENT}/click`, 'POST');
};
alert.ok = async () => {
await this.proxyCommand(`/element/${okButton.ELEMENT}/click`, 'POST');
};
}
alert.getText = async () => {
let textView = await this.findNativeElementOrElements('class name', 'XCUIElementTypeTextView', false, alert.ELEMENT);
return await this.proxyCommand(`/element/${textView.ELEMENT}/attribute/value`, 'GET');
};
alert.setText = async (value) => {
try {
let textView = await this.findNativeElementOrElements('class name', 'XCUIElementTypeTextField', false, alert.ELEMENT);
await this.proxyCommand(`/element/${textView.ELEMENT}/value `, 'POST', {value});
} catch (err) {
if (isErrorType(err, errors.NoSuchElementError)) {
throw new Error('Tried to set text of an alert that was not a prompt');
}
throw err;
}
};
return alert;
};
Object.assign(extensions, commands, helpers);
export { commands, helpers };
export default extensions;