I’m facing a prolem, appium cannot switch tab in safari
Here is the situation:
I got webview A , and contains a link to webView B, if i click that link , it goes to B,
But after that, i need to back to A…
Here is my code:
String currentWindow = driver.getWindowHandle();
XXXXXXXXXXXXXXXXXXX
driver.switchTo().window(currentWindow)
is not working… is there any walk around here?
I had the same issue. Switching of tabs doesn’t happens. I searched a lot on forums but no answer.
I implemented a work around- I click on the coordinates which will bring the next tab on the top.
You can make this dynamic by getting the width of your device and then divide the width by number of tabs you are expecting.(apply some logic to play with coordintes) and for y - I used hardcoding. This strategy worked. You still need to do context switching. It happens internally but you have to bring that tab by the workaround to the top.
This is what I tried and it appeared to have worked when switching Safari tabs with Appium 1.18.1 with Groovy. Java implementation shouldn’t be much different.
Note that I did not add following desired capabilities. Adding them broke this test for me.
Below is my implemenation. All sleep methods are using times in ms. These sleeps are very important. Clicking on Allow button to accept the permissions alerts takes time, little more than a minute but does work.
public void switchToNewTab() {
clickElementByXpath(Xpath of the link that opens new tab) // This is just a wrapper method to find element and click by xpath. You can have your method to click the link. This displays a permissions alert message with Block and Allow buttons on it. Clicking on Allow opens the new tab.
logger.info("Clicked on the link to open new tab")
acceptAlert() // This method is to click on Allow button the permissions alert. Implimenation is below.
sleep(3000)
Set<String> contextView = driver.getContextHandles()
sleep(3000)
ArrayList<String> al = new ArrayList<String>(contextView) // This will get a list of 3 context views. One native where alert is present and two webviews for two tabs.
sleep(2000)
driver.context(al.get(2)) // This switches the focus to the newly opened tab.
logger.info("Page title: " + driver.getTitle())
// You can write more logic here to find what you are looking for your test.
driver.close() // Close the newly opened tab. This has been a little inconsistent for me. It wouldn't always close. Perhaps you can try with adding some wait around it.
}
Implementation of acceptAlert() method.
private void acceptAlert() {
swithContextTo("NATIVE") // Change the context to native to interact with the alert prompt.
try {
String alertText = driver.switchTo.alert().getText()
logger.info(alertText)
clickElementByIOSPredicateString("type=='XCUIElementTypeButton' AND name=='Allow'")
// This is a wrapper method around findElement by predicate string)
logger.info("Clicked on Allow button on permission alert.")
} catch(Exception e) {
e.printStackTrace()
}
swithContextTo("WEBVIEW") // Don't forget to change the context back to Webview to interact with new browser tab.
}