Java 如何使用Selenium Webdriver验证浏览器通知

Java 如何使用Selenium Webdriver验证浏览器通知,java,selenium,push-notification,webdriver,core,Java,Selenium,Push Notification,Webdriver,Core,我正在使用SeleniumWebDriver和CoreJava自动化一个测试用例,在这个测试用例中,单击一个按钮,我会得到浏览器级别的通知“显示带有选项Allow和Block的通知”。单击“允许”按钮后,我想验证web推送通知的内容,并单击它们。有人知道如何通过selenium做到这一点吗 您可以控制Firefox配置文件范围的首选项以允许web通知 profile.setPreference("permissions.default.desktop-notification", 1); 有关

我正在使用SeleniumWebDriver和CoreJava自动化一个测试用例,在这个测试用例中,单击一个按钮,我会得到浏览器级别的通知“显示带有选项Allow和Block的通知”。单击“允许”按钮后,我想验证web推送通知的内容,并单击它们。有人知道如何通过selenium做到这一点吗


您可以控制Firefox配置文件范围的首选项以允许web通知

profile.setPreference("permissions.default.desktop-notification", 1);

有关更多信息,请参阅几乎重复的问题和答案:

对于我在Chrome中的测试,我使用以下内容检查推送通知是否可见

//SITE: 
 driver.get("http://makemytrip.com/");

//Test for PUSH NOTIFICATION

if(driver.findElement(By.cssSelector("[id='webpush-bubble']" )).isDisplayed()) {
   System.out.println("Push Prompt is Present");

//Popup active(as iFrame) so navigate in it and get text
//See=> https://sqa.stackexchange.com/questions/31693/how-to-read-html-source-from-iframe-using-selinium-webdriver
  WebElement iFrame = driver.findElements(By.tagName("iframe")).get(6); 
 driver.switchTo().frame(iFrame);
          System.out.println(driver.findElement(By.xpath("//div[@class='description']")).getText());
//Then switch back to normal content for any other navigation           
driver.switchTo().defaultContent();

    } else {
        System.out.println("Push Prompt NOT Present");
    }

似乎没有办法通过Webdriver本机处理它

但是,如果您可以控制网站的源代码(或者可以要求开发人员添加几行代码),那么实际上有一种方法可以对其进行测试

只需将创建的通知保存在全局Javascript变量中:

var lastNotification;

// Later in the code where the notification is created...
let notification = new Notification(...);
// ... save it to be accessed from WebDriver tests. Also could be pushed to a list if many notifications can be present at the same time.
lastNotification = notification;
然后,您可以从WebDriver等待通知出现(如果需要):

然后,您可以单击它(或者执行
通知
Javascript API允许您执行的任何操作):


请编辑问题,将其限制为特定问题,并提供足够详细的信息,以确定适当的答案。避免同时问多个不同的问题。请参阅页面以获取澄清此问题的帮助。@DebanjanB:谢谢DebanjanB,我已编辑了我的问题。如果这是警报,您可以使用以下代码:alert alert=driver.switchTo().alert();alert.getText();您是否尝试将其定位为简单页面元素?尝试将其定位为框架、警报或带有web元素的简单面板,并与它们交互,查找文本或“x”或其他内容并进行交互。简单面板是什么意思,我尝试了警报和框架。对于警报,它只是显示警报未打开的异常。我猜它不把通知OptIn弹出作为警告,同样的事情也与框架有关,我尝试了不同索引的帧,也没有名字,没有任何东西检查DOM模型中的某个东西,但是OP问如何处理浏览器原生通知(用<代码>通知< /代码> JavaScript API创建)。。这只允许显示通知,但无助于实际处理通知(检测通知、单击通知或关闭通知等)。如果需要,请查看我的答案:)
new WebDriverWait(...).until(ExpectedConditions.jsReturnsValue("return lastNotification");
JavascriptExecutor jsDriver = (JavascriptExecutor) driver;
jsDriver.executeScript("lastNotification.dispatchEvent(new Event('click'))");