当我打开Web应用程序时,我会弹出一个窗口。我试图通过两种方式单击“允许”按钮:
1)当我添加权限时:
caps.setCapability("autoGrantPermissions", true);
caps.setCapability("autoAcceptAlerts", true);
......
driver.switchTo().alert().accept();
什么都没发生((
2)当我尝试通过XPath查找它时:
driver.findElement(By.xpath("//android.widget.Button[@text='Allow']")).click();
我得到一个错误:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//android.widget.Button[@text='Allow']"}
这是我从UI Automator Viewer中获得的屏幕截图:
我发现了这篇文章:Unable to tap the link after tap on Allow button of permission alert in Appium? 但这并没有帮助我。
答案 0 :(得分:5)
首先:您尝试使用的功能用于 IOS only
在Android上,您必须通过findElement
找到弹出窗口,然后自行关闭弹出窗口。
第二:自从为网络应用启动Appium会话以来,在搜索本机弹出窗口之前,您必须切换上下文:
String webContext = driver.getContext();
Set<String> contexts = driver.getContextHandles();
for (String context: contexts){
if (context.contains("NATIVE_APP")){
driver.context(context);
break;
}
}
driver.findElement(By.id("android:id/button1")).click();
别忘了将上下文切换回Web继续:
driver.context(webContext);
答案 1 :(得分:2)
我也遇到过类似的问题,这就是我的解决方法:
这是我页面对象代码的一部分,当单击useGPS时,显示本机Android通知以允许或阻止GPS使用,
function getExcelData(filename){
return new Promise(function(resolve,reject){
XlsxPopulate.fromFileAsync(filename,{password : 'secret'})
.then(workbook => {
// Modify the workbook.
var sheet = workbook.sheet(0);
//logic
}, function (err){
console.log(err)
});
}); }
这是一个重写的类public Alert clickButtonUseGPSwithAlert() {
buttonUseGps.click();
Validate.action(getSessionInfo(), "click button 'Use a GPS'");
Alert alert = new Alert(getSessionInfo());
return alert;
}
,
Alert
忽略屏幕扩展,只需尝试使用现有Alert(org.openqa.selenium.Alert包)的实现。
我知道这不是解决方案。1:1您必须对其进行调整,以将其合并到您的代码中,但要点是尝试覆盖Alert并等待元素出现,然后与其进行交互。
希望这对您有帮助,
答案 2 :(得分:1)
尝试这样设置功能:
caps.setCapability("autoDismissAlerts", true);
caps.setCapability("autoGrantPermissions", true);
caps.setCapability("autoAcceptAlerts", true);
......
driver.switchTo().alert().accept();
如果无法解决问题,请尝试使用以下xPath查找“ ALLOW”按钮:
//*[. = 'Allow']
或
//*[contains(text(), 'Allow')]
或
//*[contains(text(), 'ALLOW')]
或
driver.findElement(By.id("com.android.chrome:id/button1")).click();
此外,您可以尝试通过在浏览器中打开应用来找到此按钮,然后在开发工具中找到该按钮的选择器并在Appium中使用。
PS:在您的代码中添加一个WebDriverWait
:
new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[. = 'Allow']"))).click();
这将至少等待10秒钟,直到元素可单击为止。有时脚本非常快,并且此时的DOM
不包含您要与之交互的元素。因此,您必须等待一段时间,直到元素将位于DOM
中。因此,在脚本中添加等待非常有用。
对于WebDriverWait
,您必须添加一些导入:
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;