59

I'm trying to login to Facebook. After a successful login, I get a browser popup:

Show Notifications

How with the webdriver can I click Allow and proceed forward?

timbre timbre
  • 12,648
  • 10
  • 46
  • 77
Sidhant
  • 675
  • 1
  • 7
  • 13

8 Answers8

71

Please Follow below steps :

A) USING JAVA :

For Old Chrome Version (<50):

//Create a instance of ChromeOptions class
ChromeOptions options = new ChromeOptions();

//Add chrome switch to disable notification - "**--disable-notifications**"
options.addArguments("--disable-notifications");
        
//Set path for driver exe 
System.setProperty("webdriver.chrome.driver","path/to/driver/exe");

//Pass ChromeOptions instance to ChromeDriver Constructor
WebDriver driver =new ChromeDriver(options);

For New Chrome Version (>50):

//Create a map to store  preferences 
Map<String, Object> prefs = new HashMap<String, Object>();
    
//add key and value to map as follow to switch off browser notification
//Pass the argument 1 to allow and 2 to block
prefs.put("profile.default_content_setting_values.notifications", 2);
    
//Create an instance of ChromeOptions 
ChromeOptions options = new ChromeOptions();
    
// set ExperimentalOption - prefs 
options.setExperimentalOption("prefs", prefs);
    
//Now Pass ChromeOptions instance to ChromeDriver Constructor to initialize chrome driver which will switch off this browser notification on the chrome browser
WebDriver driver = new ChromeDriver(options);

For Firefox :

WebDriver driver ;
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("permissions.default.desktop-notification", 1);
DesiredCapabilities capabilities=DesiredCapabilities.firefox();
capabilities.setCapability(FirefoxDriver.PROFILE, profile);
driver = new FirefoxDriver(capabilities);
driver.get("http://google.com");

B) USING PYTHON :

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

option = Options()

option.add_argument("--disable-infobars")
option.add_argument("start-maximized")
option.add_argument("--disable-extensions")

# Pass the argument 1 to allow and 2 to block
option.add_experimental_option(
    "prefs", {"profile.default_content_setting_values.notifications": 1}
)

driver = webdriver.Chrome(
    chrome_options=option, executable_path="path-of-driver\chromedriver.exe"
)
driver.get("https://www.facebook.com")

C) USING C#:

ChromeOptions options = new ChromeOptions();
options.AddArguments("--disable-notifications"); // to disable notification
IWebDriver driver = new ChromeDriver(options);
S.B
  • 13,077
  • 10
  • 22
  • 49
Pritam Maske
  • 2,670
  • 2
  • 22
  • 29
  • 2
    this works for older versions of chromedriver. (Chrome 49 compatible ones...) This does not work for later versions. Not sure when the cutoff was, but for the latest version you need to use the prefs HashMap option. Saurabh Gaur's answer. – pcalkins Apr 07 '18 at 19:04
  • 1
    the question is about how to ALLOW by default, the `profile.default_content_setting_values.notifications=2` will DISALLOW by default, to ALLOW it should be `profile.default_content_setting_values.notifications=1` – srghma Apr 10 '19 at 16:02
  • 1
    How to do this for safari? – Rodrigo Gomez-Palacio Feb 04 '20 at 03:16
  • This is so neat that you have provided the 3 common most languages used for selenium. – rodude123 Nov 16 '20 at 01:59
13
import unittest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
import time


class SendMsgSkype(unittest.TestCase):

    @classmethod
    def setUpClass(cls):

        options = Options()
        options.add_argument("--disable-notifications")

        cls.driver = webdriver.Chrome("./chromedriver.exe", chrome_options=options)

        cls.driver.implicitly_wait(5)
        cls.driver.maximize_window()
        cls.driver.get("https://web.skype.com/ru/")

It works for me. More details here: http://nullege.com/codes/show/src@t@a@TardyParty-HEAD@oxbiz.py/21/selenium.webdriver.Chrome

S.B
  • 13,077
  • 10
  • 22
  • 49
Igor Z
  • 601
  • 6
  • 7
  • This works for me, using Python 3.7 and latest selenium in Feb 2019. For the noobish like me, and also if you are using selenium to scrape some results after login (consensus seems use requests package unless you need login / click buttons), rather than testing webpages, key lines are: `from selenium import webdriver....options = webdriver.ChromeOptions() options.add_argument("--disable-notifications") driver = webdriver.Chrome("path/to/ChromeDriver.exe", options= options)` or as OP wanted in fact to enable notifications, presumably `("--enable-notifications")` is the main alternative. – Will Croxford Feb 19 '19 at 09:47
12

This not an alert box, so you can't handle it using Alert, this is a chrome browser notification, To Switch off this browser notification you need to create chrome preference map with chrome option as below :

//Create prefs map to store all preferences 
Map<String, Object> prefs = new HashMap<String, Object>();
    
//Put this into prefs map to switch off browser notification
prefs.put("profile.default_content_setting_values.notifications", 2);

//Create chrome options to set this prefs
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", prefs);
    
//Now initialize chrome driver with chrome options which will switch off this browser notification on the chrome browser
WebDriver driver = new ChromeDriver(options);

//Now do your further steps

Hope it helps..:)

S.B
  • 13,077
  • 10
  • 22
  • 49
Saurabh Gaur
  • 23,507
  • 10
  • 54
  • 73
8

The one and only working solution I've come across so far is this:

from selenium.webdriver.chrome.options import Options

chrome_options = webdriver.ChromeOptions()
prefs = {"profile.default_content_setting_values.notifications": 2}
chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(chrome_options=chrome_options)
S.B
  • 13,077
  • 10
  • 22
  • 49
SIM
  • 21,997
  • 5
  • 37
  • 109
  • doesn't work, check this https://stackoverflow.com/questions/51440682/cant-accept-popup?noredirect=1#comment89851546_51440682 – ishandutta2007 Jul 20 '18 at 10:46
2

no answer has been accepted yet, this following code works for me

ruby, rspec, capybara

Capybara.register_driver :selenium_chrome do |app|
  prefs = {"profile.managed_default_content_settings.notifications" => 2,}
  caps = Selenium::WebDriver::Remote::Capabilities.chrome(chrome_options: { prefs: prefs })

  Capybara::Selenium::Driver.new(app, browser: :chrome, desired_capabilities: caps)
end

Capybara.javascript_driver = :selenium_chrome
Dorian
  • 22,759
  • 8
  • 120
  • 116
Jin.X
  • 120
  • 7
1
try {

   // Check the presence of alert
   Alert alert = driver.SwitchTo().Alert();

   // if present consume the alert
   alert.Accept();

  } catch (NoAlertPresentException ex) {
     //code to do if not exist.
  }
Leon Barkan
  • 2,676
  • 2
  • 19
  • 43
1

Facebook authentication window displays an overlay that covers the continue as [username] button.

enter image description here

This makes the continue button un-clickable. To circumvent that problem, you can hide those layers programmatically using JavaScript (not recommended) using this code (don't do this).

  // DO NOT USE THIS CODE.
  function forceClickSetup(targetSelector) {
      return browser.selectorExecute("div", 
      function(divs, targetSelector) {
        var button = document.querySelector(targetSelector);
        for(var i = 0; i < divs.length; i++) {
          if(!divs[i].contains(button)) {
            divs[i].remove();
          }
        }
        return i;
    }, targetSelector);
  }

Or instead, you can dismiss the notifications dialog, after which facebook will uncover the continue button. But before wildly hitting Escape at the browser, first make sure that the continue button has been shown.

// USE THIS CODE.
browser.waitForVisible("[name=__CONFIRM__]");
browser.keys("Escape"); // Dismiss "notifications" dialog box.

var confirmButtonSelector = "[name=__CONFIRM__]";

This solution is really Matthijs' (see comments above)

Garrett
  • 2,936
  • 1
  • 20
  • 22
0

if you play with Ruby and Capybara try this code

    Capybara.register_driver :chrome_no_image_popup_maximize do |app|
    # 2: disable, other than 2 means enable it
    preferences = {
        "profile.managed_default_content_settings.notifications" => 2,
        "profile.managed_default_content_settings.images" => 2,
        "profile.managed_default_content_settings.popups" => 2   
    }

    caps = Selenium::WebDriver::Remote::Capabilities.chrome( 
        'chromeOptions' => {
            'prefs' => preferences, 
        } 
    )

    args = [ "--start-maximized" ]

    Capybara::Selenium::Driver.new(app, {:browser => :chrome, :desired_capabilities => caps, :args => args})
end

Capybara.default_driver = :chrome_no_image_popup_maximize
Capybara.javascript_driver = :chrome_no_image_popup_maximize