You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Here is my code await switchDriverTo('webview'); await switchWindowHandle(); const element = $('//div[@data-testid="alert-message"]//a[contains(text(),"contact us")]'); await element.scrollIntoView(); await element.waitForClickable() await element.click() console.log(await element.isClickable()) await driver.pause(5000)
And here is the logs
Contexts available NATIVE_APP,WEBVIEW_1645.4
[0-2] Switching context to Webview
[0-2] 2025-03-16T22:30:32.624Z INFO webdriver: COMMAND switchContext("WEBVIEW_1645.4")
[0-2] 2025-03-16T22:30:32.625Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.625Z INFO webdriver: DATA { name: 'WEBVIEW_1645.4' }
[0-2] 2025-03-16T22:30:32.648Z INFO webdriver: RESULT null
[0-2] 2025-03-16T22:30:32.648Z INFO webdriver: COMMAND getWindowHandles()
[0-2] 2025-03-16T22:30:32.648Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/window/handles
[0-2] 2025-03-16T22:30:32.654Z INFO webdriver: RESULT [ '1645.4' ]
[0-2] Windows available 1645.4
[0-2] 2025-03-16T22:30:32.654Z INFO webdriver: COMMAND findElement("xpath", "//div[@data-testid="alert-message"]//a[contains(text(),"contact us")]")
[0-2] 2025-03-16T22:30:32.654Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/element
[0-2] 2025-03-16T22:30:32.654Z INFO webdriver: DATA {
[0-2] using: 'xpath',
[0-2] value: '//div[@data-testid="alert-message"]//a[contains(text(),"contact us")]'
[0-2] }
[0-2] 2025-03-16T22:30:32.683Z INFO webdriver: RESULT {
[0-2] 'element-6066-11e4-a52e-4f735466cecf': ':wdc:1742164232660',
[0-2] ELEMENT: ':wdc:1742164232660'
[0-2] }
[0-2] 2025-03-16T22:30:32.685Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.685Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.687Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.688Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.688Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.689Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.690Z INFO webdriver: COMMAND executeScript("
[0-2] var __defProp = Object.defineProperty;var __name = function (target, value) { return __defProp(target, 'name', { value: value, configurable: true }); };var __globalThis = (typeof globalThis === 'object' && globalThis) || (typeof window === 'object' && window);__globalThis.__name = __name;
[0-2] return ((elem, options2) => elem.scrollIntoView(options2)).apply(null, arguments)
[0-2] ", )
[0-2] 2025-03-16T22:30:32.690Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/execute/sync
[0-2] 2025-03-16T22:30:32.690Z INFO webdriver: DATA {
[0-2] script: '\n' +
[0-2] " var __defProp = Object.defineProperty;var __name = function (target, value) { return __defProp(target, 'name', { value: value, configurable: true }); };var __globalThis = (typeof globalThis === 'object' && globalThis) || (typeof window === 'object' && window);__globalThis.__name = __name;\n" +
[0-2] ' return ((elem, options2) => elem.scrollIntoView(options2)).apply(null, arguments)\n' +
[0-2] ' ',
[0-2] args: [
[0-2] {
[0-2] 'element-6066-11e4-a52e-4f735466cecf': ':wdc:1742164232660',
[0-2] ELEMENT: ':wdc:1742164232660'
[0-2] },
[0-2] { block: 'start', inline: 'nearest' }
[0-2] ]
[0-2] }
[0-2] 2025-03-16T22:30:32.699Z INFO webdriver: RESULT null
[0-2] 2025-03-16T22:30:32.699Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.699Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.701Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.702Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.702Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.704Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.704Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.704Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.706Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.706Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.706Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.708Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.708Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.708Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.709Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.710Z INFO webdriver: COMMAND isElementDisplayed(":wdc:1742164232660")
[0-2] 2025-03-16T22:30:32.710Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/element/%3Awdc%3A1742164232660/displayed
[0-2] 2025-03-16T22:30:32.733Z INFO webdriver: RESULT true
[0-2] 2025-03-16T22:30:32.733Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.734Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.735Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.736Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.736Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.737Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.737Z INFO webdriver: COMMAND executeScript("
[0-2] var __defProp = Object.defineProperty;var __name = function (target, value) { return __defProp(target, 'name', { value: value, configurable: true }); };var __globalThis = (typeof globalThis === 'object' && globalThis) || (typeof window === 'object' && window);__globalThis.__name = __name;
[0-2] return (function isElementClickable(elem) {
[0-2] if (!elem.getBoundingClientRect || !elem.scrollIntoView || !elem.contains || !elem.getClientRects || !document.elementFromPoint) {
[0-2] return false;
[0-2] }
[0-2] const isOldEdge = !!window.StyleMedia;
[0-2] const scrollIntoViewFullSupport = !(window.safari || isOldEdge);
[0-2] function getOverlappingElement(elem2, context) {
[0-2] context = context || document;
[0-2] const elemDimension = elem2.getBoundingClientRect();
[0-2] const x = elemDimension.left + elem2.clientWidth / 2;
[0-2] const y = elemDimension.top + elem2.clientHeight / 2;
[0-2] return context.elementFromPoint(x, y);
[0-2] }
[0-2] function getOverlappingRects(elem2, context) {
[0-2] context = context || document;
[0-2] const rects = elem2.getClientRects();
[0-2] const rect = rects[0];
[0-2] const x = rect.left + rect.width / 2;
[0-2] const y = rect.top + rect.height / 2;
[0-2] return [context.elementFromPoint(x, y)];
[0-2] }
[0-2] function getOverlappingElements(elem2, context) {
[0-2] return [getOverlappingElement(elem2, context)].concat(getOverlappingRects(elem2, context));
[0-2] }
[0-2] function nodeContains(elem2, otherNode) {
[0-2] if (isOldEdge) {
[0-2] let tmpElement = otherNode;
[0-2] while (tmpElement) {
[0-2] if (tmpElement === elem2) {
[0-2] return true;
[0-2] }
[0-2] tmpElement = tmpElement.parentNode;
[0-2] if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) {
[0-2] tmpElement = tmpElement.host;
[0-2] }
[0-2] }
[0-2] return false;
[0-2] }
[0-2] return elem2.contains(otherNode);
[0-2] }
[0-2] function isOverlappingElementMatch(elementsFromPoint, elem2) {
[0-2] if (elementsFromPoint.some(function(elementFromPoint) {
[0-2] return elementFromPoint === elem2 || nodeContains(elem2, elementFromPoint);
[0-2] })) {
[0-2] return true;
[0-2] }
[0-2] let elemsWithShadowRoot = [].concat(elementsFromPoint);
[0-2] elemsWithShadowRoot = elemsWithShadowRoot.filter(function(x) {
[0-2] return x && x.shadowRoot && x.shadowRoot.elementFromPoint;
[0-2] });
[0-2] let shadowElementsFromPoint = [];
[0-2] for (let i = 0; i < elemsWithShadowRoot.length; ++i) {
[0-2] const shadowElement = elemsWithShadowRoot[i];
[0-2] shadowElementsFromPoint = shadowElementsFromPoint.concat(
[0-2] getOverlappingElements(elem2, shadowElement.shadowRoot)
[0-2] );
[0-2] }
[0-2] shadowElementsFromPoint = [].concat(shadowElementsFromPoint);
[0-2] shadowElementsFromPoint = shadowElementsFromPoint.filter(function(x) {
[0-2] return !elementsFromPoint.includes(x);
[0-2] });
[0-2] if (shadowElementsFromPoint.length === 0) {
[0-2] return false;
[0-2] }
[0-2] return isOverlappingElementMatch(shadowElementsFromPoint, elem2);
[0-2] }
[0-2] function isElementInViewport(elem2) {
[0-2] if (!elem2.getBoundingClientRect) {
[0-2] return false;
[0-2] }
[0-2] const rect = elem2.getBoundingClientRect();
[0-2] const windowHeight = window.innerHeight || document.documentElement.clientHeight;
[0-2] const windowWidth = window.innerWidth || document.documentElement.clientWidth;
[0-2] const vertInView = rect.top <= windowHeight && rect.top + rect.height > 0;
[0-2] const horInView = rect.left <= windowWidth && rect.left + rect.width > 0;
[0-2] return vertInView && horInView;
[0-2] }
[0-2] function isEnabled(elem2) {
[0-2] return elem2.disabled !== true;
[0-2] }
[0-2] function hasOverlaps(elem2) {
[0-2] return !isOverlappingElementMatch(getOverlappingElements(elem2), elem2);
[0-2] }
[0-2] function isFullyDisplayedInViewport(elem2) {
[0-2] return isElementInViewport(elem2) && !hasOverlaps(elem2);
[0-2] }
[0-2] let _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
[0-2] if (!_isFullyDisplayedInViewport) {
[0-2] const { x: originalX, y: originalY } = elem.getBoundingClientRect();
[0-2] elem.scrollIntoView(scrollIntoViewFullSupport ? { block: "center", inline: "center" } : false);
[0-2] _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
[0-2] const { x, y } = elem.getBoundingClientRect();
[0-2] if (x !== originalX || y !== originalY) {
[0-2] elem.scroll(scrollX, scrollY);
[0-2] }
[0-2] }
[0-2] return _isFullyDisplayedInViewport && isEnabled(elem);
[0-2] }).apply(null, arguments)
[0-2] ", )
[0-2] 2025-03-16T22:30:32.738Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/execute/sync
[0-2] 2025-03-16T22:30:32.738Z INFO webdriver: DATA {
[0-2] script: 'isElementClickable(...) [4282 bytes]',
[0-2] args: [
[0-2] {
[0-2] 'element-6066-11e4-a52e-4f735466cecf': ':wdc:1742164232660',
[0-2] ELEMENT: ':wdc:1742164232660'
[0-2] }
[0-2] ]
[0-2] }
[0-2] 2025-03-16T22:30:32.748Z INFO webdriver: RESULT true
[0-2] 2025-03-16T22:30:32.748Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.748Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.752Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.752Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.752Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.753Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.754Z INFO webdriver: COMMAND elementClick(":wdc:1742164232660")
[0-2] 2025-03-16T22:30:32.754Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/element/%3Awdc%3A1742164232660/click
[0-2] 2025-03-16T22:30:32.773Z INFO webdriver: RESULT null
[0-2] 2025-03-16T22:30:32.773Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.773Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.775Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.775Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.775Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.776Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.776Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.777Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.778Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.778Z INFO webdriver: COMMAND isElementDisplayed(":wdc:1742164232660")
[0-2] 2025-03-16T22:30:32.778Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/element/%3Awdc%3A1742164232660/displayed
[0-2] 2025-03-16T22:30:32.787Z INFO webdriver: RESULT true
[0-2] 2025-03-16T22:30:32.788Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.788Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.789Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.789Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.789Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.791Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.791Z INFO webdriver: COMMAND executeScript("
[0-2] var __defProp = Object.defineProperty;var __name = function (target, value) { return __defProp(target, 'name', { value: value, configurable: true }); };var __globalThis = (typeof globalThis === 'object' && globalThis) || (typeof window === 'object' && window);__globalThis.__name = __name;
[0-2] return (function isElementClickable(elem) {
[0-2] if (!elem.getBoundingClientRect || !elem.scrollIntoView || !elem.contains || !elem.getClientRects || !document.elementFromPoint) {
[0-2] return false;
[0-2] }
[0-2] const isOldEdge = !!window.StyleMedia;
[0-2] const scrollIntoViewFullSupport = !(window.safari || isOldEdge);
[0-2] function getOverlappingElement(elem2, context) {
[0-2] context = context || document;
[0-2] const elemDimension = elem2.getBoundingClientRect();
[0-2] const x = elemDimension.left + elem2.clientWidth / 2;
[0-2] const y = elemDimension.top + elem2.clientHeight / 2;
[0-2] return context.elementFromPoint(x, y);
[0-2] }
[0-2] function getOverlappingRects(elem2, context) {
[0-2] context = context || document;
[0-2] const rects = elem2.getClientRects();
[0-2] const rect = rects[0];
[0-2] const x = rect.left + rect.width / 2;
[0-2] const y = rect.top + rect.height / 2;
[0-2] return [context.elementFromPoint(x, y)];
[0-2] }
[0-2] function getOverlappingElements(elem2, context) {
[0-2] return [getOverlappingElement(elem2, context)].concat(getOverlappingRects(elem2, context));
[0-2] }
[0-2] function nodeContains(elem2, otherNode) {
[0-2] if (isOldEdge) {
[0-2] let tmpElement = otherNode;
[0-2] while (tmpElement) {
[0-2] if (tmpElement === elem2) {
[0-2] return true;
[0-2] }
[0-2] tmpElement = tmpElement.parentNode;
[0-2] if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) {
[0-2] tmpElement = tmpElement.host;
[0-2] }
[0-2] }
[0-2] return false;
[0-2] }
[0-2] return elem2.contains(otherNode);
[0-2] }
[0-2] function isOverlappingElementMatch(elementsFromPoint, elem2) {
[0-2] if (elementsFromPoint.some(function(elementFromPoint) {
[0-2] return elementFromPoint === elem2 || nodeContains(elem2, elementFromPoint);
[0-2] })) {
[0-2] return true;
[0-2] }
[0-2] let elemsWithShadowRoot = [].concat(elementsFromPoint);
[0-2] elemsWithShadowRoot = elemsWithShadowRoot.filter(function(x) {
[0-2] return x && x.shadowRoot && x.shadowRoot.elementFromPoint;
[0-2] });
[0-2] let shadowElementsFromPoint = [];
[0-2] for (let i = 0; i < elemsWithShadowRoot.length; ++i) {
[0-2] const shadowElement = elemsWithShadowRoot[i];
[0-2] shadowElementsFromPoint = shadowElementsFromPoint.concat(
[0-2] getOverlappingElements(elem2, shadowElement.shadowRoot)
[0-2] );
[0-2] }
[0-2] shadowElementsFromPoint = [].concat(shadowElementsFromPoint);
[0-2] shadowElementsFromPoint = shadowElementsFromPoint.filter(function(x) {
[0-2] return !elementsFromPoint.includes(x);
[0-2] });
[0-2] if (shadowElementsFromPoint.length === 0) {
[0-2] return false;
[0-2] }
[0-2] return isOverlappingElementMatch(shadowElementsFromPoint, elem2);
[0-2] }
[0-2] function isElementInViewport(elem2) {
[0-2] if (!elem2.getBoundingClientRect) {
[0-2] return false;
[0-2] }
[0-2] const rect = elem2.getBoundingClientRect();
[0-2] const windowHeight = window.innerHeight || document.documentElement.clientHeight;
[0-2] const windowWidth = window.innerWidth || document.documentElement.clientWidth;
[0-2] const vertInView = rect.top <= windowHeight && rect.top + rect.height > 0;
[0-2] const horInView = rect.left <= windowWidth && rect.left + rect.width > 0;
[0-2] return vertInView && horInView;
[0-2] }
[0-2] function isEnabled(elem2) {
[0-2] return elem2.disabled !== true;
[0-2] }
[0-2] function hasOverlaps(elem2) {
[0-2] return !isOverlappingElementMatch(getOverlappingElements(elem2), elem2);
[0-2] }
[0-2] function isFullyDisplayedInViewport(elem2) {
[0-2] return isElementInViewport(elem2) && !hasOverlaps(elem2);
[0-2] }
[0-2] let _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
[0-2] if (!_isFullyDisplayedInViewport) {
[0-2] const { x: originalX, y: originalY } = elem.getBoundingClientRect();
[0-2] elem.scrollIntoView(scrollIntoViewFullSupport ? { block: "center", inline: "center" } : false);
[0-2] _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
[0-2] const { x, y } = elem.getBoundingClientRect();
[0-2] if (x !== originalX || y !== originalY) {
[0-2] elem.scroll(scrollX, scrollY);
[0-2] }
[0-2] }
[0-2] return _isFullyDisplayedInViewport && isEnabled(elem);
[0-2] }).apply(null, arguments)
[0-2] ", )
[0-2] 2025-03-16T22:30:32.791Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/execute/sync
[0-2] 2025-03-16T22:30:32.791Z INFO webdriver: DATA {
[0-2] script: 'isElementClickable(...) [4282 bytes]',
[0-2] args: [
[0-2] {
[0-2] 'element-6066-11e4-a52e-4f735466cecf': ':wdc:1742164232660',
[0-2] ELEMENT: ':wdc:1742164232660'
[0-2] }
[0-2] ]
[0-2] }
[0-2] 2025-03-16T22:30:32.797Z INFO webdriver: RESULT true
[0-2] true
I tried multiple ways on clicking the element but it is not doing anything. I tried double click, I tried click twice, I tried javascript way of click but none of them worked. And this is working fine in Android uiAutomator2 so not sure what is special in iOS as it is the same webview.
The text was updated successfully, but these errors were encountered:
Here is my code
await switchDriverTo('webview'); await switchWindowHandle(); const element = $('//div[@data-testid="alert-message"]//a[contains(text(),"contact us")]'); await element.scrollIntoView(); await element.waitForClickable() await element.click() console.log(await element.isClickable()) await driver.pause(5000)
And here is the logs
Contexts available NATIVE_APP,WEBVIEW_1645.4
[0-2] Switching context to Webview
[0-2] 2025-03-16T22:30:32.624Z INFO webdriver: COMMAND switchContext("WEBVIEW_1645.4")
[0-2] 2025-03-16T22:30:32.625Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.625Z INFO webdriver: DATA { name: 'WEBVIEW_1645.4' }
[0-2] 2025-03-16T22:30:32.648Z INFO webdriver: RESULT null
[0-2] 2025-03-16T22:30:32.648Z INFO webdriver: COMMAND getWindowHandles()
[0-2] 2025-03-16T22:30:32.648Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/window/handles
[0-2] 2025-03-16T22:30:32.654Z INFO webdriver: RESULT [ '1645.4' ]
[0-2] Windows available 1645.4
[0-2] 2025-03-16T22:30:32.654Z INFO webdriver: COMMAND findElement("xpath", "//div[@data-testid="alert-message"]//a[contains(text(),"contact us")]")
[0-2] 2025-03-16T22:30:32.654Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/element
[0-2] 2025-03-16T22:30:32.654Z INFO webdriver: DATA {
[0-2] using: 'xpath',
[0-2] value: '//div[@data-testid="alert-message"]//a[contains(text(),"contact us")]'
[0-2] }
[0-2] 2025-03-16T22:30:32.683Z INFO webdriver: RESULT {
[0-2] 'element-6066-11e4-a52e-4f735466cecf': ':wdc:1742164232660',
[0-2] ELEMENT: ':wdc:1742164232660'
[0-2] }
[0-2] 2025-03-16T22:30:32.685Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.685Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.687Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.688Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.688Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.689Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.690Z INFO webdriver: COMMAND executeScript("
[0-2] var __defProp = Object.defineProperty;var __name = function (target, value) { return __defProp(target, 'name', { value: value, configurable: true }); };var __globalThis = (typeof globalThis === 'object' && globalThis) || (typeof window === 'object' && window);__globalThis.__name = __name;
[0-2] return ((elem, options2) => elem.scrollIntoView(options2)).apply(null, arguments)
[0-2] ", )
[0-2] 2025-03-16T22:30:32.690Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/execute/sync
[0-2] 2025-03-16T22:30:32.690Z INFO webdriver: DATA {
[0-2] script: '\n' +
[0-2] " var __defProp = Object.defineProperty;var __name = function (target, value) { return __defProp(target, 'name', { value: value, configurable: true }); };var __globalThis = (typeof globalThis === 'object' && globalThis) || (typeof window === 'object' && window);__globalThis.__name = __name;\n" +
[0-2] ' return ((elem, options2) => elem.scrollIntoView(options2)).apply(null, arguments)\n' +
[0-2] ' ',
[0-2] args: [
[0-2] {
[0-2] 'element-6066-11e4-a52e-4f735466cecf': ':wdc:1742164232660',
[0-2] ELEMENT: ':wdc:1742164232660'
[0-2] },
[0-2] { block: 'start', inline: 'nearest' }
[0-2] ]
[0-2] }
[0-2] 2025-03-16T22:30:32.699Z INFO webdriver: RESULT null
[0-2] 2025-03-16T22:30:32.699Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.699Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.701Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.702Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.702Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.704Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.704Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.704Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.706Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.706Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.706Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.708Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.708Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.708Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.709Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.710Z INFO webdriver: COMMAND isElementDisplayed(":wdc:1742164232660")
[0-2] 2025-03-16T22:30:32.710Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/element/%3Awdc%3A1742164232660/displayed
[0-2] 2025-03-16T22:30:32.733Z INFO webdriver: RESULT true
[0-2] 2025-03-16T22:30:32.733Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.734Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.735Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.736Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.736Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.737Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.737Z INFO webdriver: COMMAND executeScript("
[0-2] var __defProp = Object.defineProperty;var __name = function (target, value) { return __defProp(target, 'name', { value: value, configurable: true }); };var __globalThis = (typeof globalThis === 'object' && globalThis) || (typeof window === 'object' && window);__globalThis.__name = __name;
[0-2] return (function isElementClickable(elem) {
[0-2] if (!elem.getBoundingClientRect || !elem.scrollIntoView || !elem.contains || !elem.getClientRects || !document.elementFromPoint) {
[0-2] return false;
[0-2] }
[0-2] const isOldEdge = !!window.StyleMedia;
[0-2] const scrollIntoViewFullSupport = !(window.safari || isOldEdge);
[0-2] function getOverlappingElement(elem2, context) {
[0-2] context = context || document;
[0-2] const elemDimension = elem2.getBoundingClientRect();
[0-2] const x = elemDimension.left + elem2.clientWidth / 2;
[0-2] const y = elemDimension.top + elem2.clientHeight / 2;
[0-2] return context.elementFromPoint(x, y);
[0-2] }
[0-2] function getOverlappingRects(elem2, context) {
[0-2] context = context || document;
[0-2] const rects = elem2.getClientRects();
[0-2] const rect = rects[0];
[0-2] const x = rect.left + rect.width / 2;
[0-2] const y = rect.top + rect.height / 2;
[0-2] return [context.elementFromPoint(x, y)];
[0-2] }
[0-2] function getOverlappingElements(elem2, context) {
[0-2] return [getOverlappingElement(elem2, context)].concat(getOverlappingRects(elem2, context));
[0-2] }
[0-2] function nodeContains(elem2, otherNode) {
[0-2] if (isOldEdge) {
[0-2] let tmpElement = otherNode;
[0-2] while (tmpElement) {
[0-2] if (tmpElement === elem2) {
[0-2] return true;
[0-2] }
[0-2] tmpElement = tmpElement.parentNode;
[0-2] if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) {
[0-2] tmpElement = tmpElement.host;
[0-2] }
[0-2] }
[0-2] return false;
[0-2] }
[0-2] return elem2.contains(otherNode);
[0-2] }
[0-2] function isOverlappingElementMatch(elementsFromPoint, elem2) {
[0-2] if (elementsFromPoint.some(function(elementFromPoint) {
[0-2] return elementFromPoint === elem2 || nodeContains(elem2, elementFromPoint);
[0-2] })) {
[0-2] return true;
[0-2] }
[0-2] let elemsWithShadowRoot = [].concat(elementsFromPoint);
[0-2] elemsWithShadowRoot = elemsWithShadowRoot.filter(function(x) {
[0-2] return x && x.shadowRoot && x.shadowRoot.elementFromPoint;
[0-2] });
[0-2] let shadowElementsFromPoint = [];
[0-2] for (let i = 0; i < elemsWithShadowRoot.length; ++i) {
[0-2] const shadowElement = elemsWithShadowRoot[i];
[0-2] shadowElementsFromPoint = shadowElementsFromPoint.concat(
[0-2] getOverlappingElements(elem2, shadowElement.shadowRoot)
[0-2] );
[0-2] }
[0-2] shadowElementsFromPoint = [].concat(shadowElementsFromPoint);
[0-2] shadowElementsFromPoint = shadowElementsFromPoint.filter(function(x) {
[0-2] return !elementsFromPoint.includes(x);
[0-2] });
[0-2] if (shadowElementsFromPoint.length === 0) {
[0-2] return false;
[0-2] }
[0-2] return isOverlappingElementMatch(shadowElementsFromPoint, elem2);
[0-2] }
[0-2] function isElementInViewport(elem2) {
[0-2] if (!elem2.getBoundingClientRect) {
[0-2] return false;
[0-2] }
[0-2] const rect = elem2.getBoundingClientRect();
[0-2] const windowHeight = window.innerHeight || document.documentElement.clientHeight;
[0-2] const windowWidth = window.innerWidth || document.documentElement.clientWidth;
[0-2] const vertInView = rect.top <= windowHeight && rect.top + rect.height > 0;
[0-2] const horInView = rect.left <= windowWidth && rect.left + rect.width > 0;
[0-2] return vertInView && horInView;
[0-2] }
[0-2] function isEnabled(elem2) {
[0-2] return elem2.disabled !== true;
[0-2] }
[0-2] function hasOverlaps(elem2) {
[0-2] return !isOverlappingElementMatch(getOverlappingElements(elem2), elem2);
[0-2] }
[0-2] function isFullyDisplayedInViewport(elem2) {
[0-2] return isElementInViewport(elem2) && !hasOverlaps(elem2);
[0-2] }
[0-2] let _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
[0-2] if (!_isFullyDisplayedInViewport) {
[0-2] const { x: originalX, y: originalY } = elem.getBoundingClientRect();
[0-2] elem.scrollIntoView(scrollIntoViewFullSupport ? { block: "center", inline: "center" } : false);
[0-2] _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
[0-2] const { x, y } = elem.getBoundingClientRect();
[0-2] if (x !== originalX || y !== originalY) {
[0-2] elem.scroll(scrollX, scrollY);
[0-2] }
[0-2] }
[0-2] return _isFullyDisplayedInViewport && isEnabled(elem);
[0-2] }).apply(null, arguments)
[0-2] ", )
[0-2] 2025-03-16T22:30:32.738Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/execute/sync
[0-2] 2025-03-16T22:30:32.738Z INFO webdriver: DATA {
[0-2] script: 'isElementClickable(...) [4282 bytes]',
[0-2] args: [
[0-2] {
[0-2] 'element-6066-11e4-a52e-4f735466cecf': ':wdc:1742164232660',
[0-2] ELEMENT: ':wdc:1742164232660'
[0-2] }
[0-2] ]
[0-2] }
[0-2] 2025-03-16T22:30:32.748Z INFO webdriver: RESULT true
[0-2] 2025-03-16T22:30:32.748Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.748Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.752Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.752Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.752Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.753Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.754Z INFO webdriver: COMMAND elementClick(":wdc:1742164232660")
[0-2] 2025-03-16T22:30:32.754Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/element/%3Awdc%3A1742164232660/click
[0-2] 2025-03-16T22:30:32.773Z INFO webdriver: RESULT null
[0-2] 2025-03-16T22:30:32.773Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.773Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.775Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.775Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.775Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.776Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.776Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.777Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.778Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.778Z INFO webdriver: COMMAND isElementDisplayed(":wdc:1742164232660")
[0-2] 2025-03-16T22:30:32.778Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/element/%3Awdc%3A1742164232660/displayed
[0-2] 2025-03-16T22:30:32.787Z INFO webdriver: RESULT true
[0-2] 2025-03-16T22:30:32.788Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.788Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.789Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.789Z INFO webdriver: COMMAND getContext()
[0-2] 2025-03-16T22:30:32.789Z INFO webdriver: [GET] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/context
[0-2] 2025-03-16T22:30:32.791Z INFO webdriver: RESULT WEBVIEW_1645.4
[0-2] 2025-03-16T22:30:32.791Z INFO webdriver: COMMAND executeScript("
[0-2] var __defProp = Object.defineProperty;var __name = function (target, value) { return __defProp(target, 'name', { value: value, configurable: true }); };var __globalThis = (typeof globalThis === 'object' && globalThis) || (typeof window === 'object' && window);__globalThis.__name = __name;
[0-2] return (function isElementClickable(elem) {
[0-2] if (!elem.getBoundingClientRect || !elem.scrollIntoView || !elem.contains || !elem.getClientRects || !document.elementFromPoint) {
[0-2] return false;
[0-2] }
[0-2] const isOldEdge = !!window.StyleMedia;
[0-2] const scrollIntoViewFullSupport = !(window.safari || isOldEdge);
[0-2] function getOverlappingElement(elem2, context) {
[0-2] context = context || document;
[0-2] const elemDimension = elem2.getBoundingClientRect();
[0-2] const x = elemDimension.left + elem2.clientWidth / 2;
[0-2] const y = elemDimension.top + elem2.clientHeight / 2;
[0-2] return context.elementFromPoint(x, y);
[0-2] }
[0-2] function getOverlappingRects(elem2, context) {
[0-2] context = context || document;
[0-2] const rects = elem2.getClientRects();
[0-2] const rect = rects[0];
[0-2] const x = rect.left + rect.width / 2;
[0-2] const y = rect.top + rect.height / 2;
[0-2] return [context.elementFromPoint(x, y)];
[0-2] }
[0-2] function getOverlappingElements(elem2, context) {
[0-2] return [getOverlappingElement(elem2, context)].concat(getOverlappingRects(elem2, context));
[0-2] }
[0-2] function nodeContains(elem2, otherNode) {
[0-2] if (isOldEdge) {
[0-2] let tmpElement = otherNode;
[0-2] while (tmpElement) {
[0-2] if (tmpElement === elem2) {
[0-2] return true;
[0-2] }
[0-2] tmpElement = tmpElement.parentNode;
[0-2] if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) {
[0-2] tmpElement = tmpElement.host;
[0-2] }
[0-2] }
[0-2] return false;
[0-2] }
[0-2] return elem2.contains(otherNode);
[0-2] }
[0-2] function isOverlappingElementMatch(elementsFromPoint, elem2) {
[0-2] if (elementsFromPoint.some(function(elementFromPoint) {
[0-2] return elementFromPoint === elem2 || nodeContains(elem2, elementFromPoint);
[0-2] })) {
[0-2] return true;
[0-2] }
[0-2] let elemsWithShadowRoot = [].concat(elementsFromPoint);
[0-2] elemsWithShadowRoot = elemsWithShadowRoot.filter(function(x) {
[0-2] return x && x.shadowRoot && x.shadowRoot.elementFromPoint;
[0-2] });
[0-2] let shadowElementsFromPoint = [];
[0-2] for (let i = 0; i < elemsWithShadowRoot.length; ++i) {
[0-2] const shadowElement = elemsWithShadowRoot[i];
[0-2] shadowElementsFromPoint = shadowElementsFromPoint.concat(
[0-2] getOverlappingElements(elem2, shadowElement.shadowRoot)
[0-2] );
[0-2] }
[0-2] shadowElementsFromPoint = [].concat(shadowElementsFromPoint);
[0-2] shadowElementsFromPoint = shadowElementsFromPoint.filter(function(x) {
[0-2] return !elementsFromPoint.includes(x);
[0-2] });
[0-2] if (shadowElementsFromPoint.length === 0) {
[0-2] return false;
[0-2] }
[0-2] return isOverlappingElementMatch(shadowElementsFromPoint, elem2);
[0-2] }
[0-2] function isElementInViewport(elem2) {
[0-2] if (!elem2.getBoundingClientRect) {
[0-2] return false;
[0-2] }
[0-2] const rect = elem2.getBoundingClientRect();
[0-2] const windowHeight = window.innerHeight || document.documentElement.clientHeight;
[0-2] const windowWidth = window.innerWidth || document.documentElement.clientWidth;
[0-2] const vertInView = rect.top <= windowHeight && rect.top + rect.height > 0;
[0-2] const horInView = rect.left <= windowWidth && rect.left + rect.width > 0;
[0-2] return vertInView && horInView;
[0-2] }
[0-2] function isEnabled(elem2) {
[0-2] return elem2.disabled !== true;
[0-2] }
[0-2] function hasOverlaps(elem2) {
[0-2] return !isOverlappingElementMatch(getOverlappingElements(elem2), elem2);
[0-2] }
[0-2] function isFullyDisplayedInViewport(elem2) {
[0-2] return isElementInViewport(elem2) && !hasOverlaps(elem2);
[0-2] }
[0-2] let _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
[0-2] if (!_isFullyDisplayedInViewport) {
[0-2] const { x: originalX, y: originalY } = elem.getBoundingClientRect();
[0-2] elem.scrollIntoView(scrollIntoViewFullSupport ? { block: "center", inline: "center" } : false);
[0-2] _isFullyDisplayedInViewport = isFullyDisplayedInViewport(elem);
[0-2] const { x, y } = elem.getBoundingClientRect();
[0-2] if (x !== originalX || y !== originalY) {
[0-2] elem.scroll(scrollX, scrollY);
[0-2] }
[0-2] }
[0-2] return _isFullyDisplayedInViewport && isEnabled(elem);
[0-2] }).apply(null, arguments)
[0-2] ", )
[0-2] 2025-03-16T22:30:32.791Z INFO webdriver: [POST] http://127.0.0.1:4723/session/7d032273-6f35-4abf-a9e8-3d7f6c5e19c5/execute/sync
[0-2] 2025-03-16T22:30:32.791Z INFO webdriver: DATA {
[0-2] script: 'isElementClickable(...) [4282 bytes]',
[0-2] args: [
[0-2] {
[0-2] 'element-6066-11e4-a52e-4f735466cecf': ':wdc:1742164232660',
[0-2] ELEMENT: ':wdc:1742164232660'
[0-2] }
[0-2] ]
[0-2] }
[0-2] 2025-03-16T22:30:32.797Z INFO webdriver: RESULT true
[0-2] true
I tried multiple ways on clicking the element but it is not doing anything. I tried double click, I tried click twice, I tried javascript way of click but none of them worked. And this is working fine in Android uiAutomator2 so not sure what is special in iOS as it is the same webview.
The text was updated successfully, but these errors were encountered: