Web应用程序中的Appium:无法在通知弹出窗口中点击允许权限按钮

时间:2018-07-04 13:23:56

标签: java selenium testing automation appium

当我打开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中获得的屏幕截图:

enter image description here

我发现了这篇文章:Unable to tap the link after tap on Allow button of permission alert in Appium? 但这并没有帮助我。

3 个答案:

答案 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;