How to change Firefox headless mode on the fly with Selenium? - python

I currently have my Selenium Firefox set up as so:
options = Options()
options.headless = True #hides browser
driver = webdriver.Firefox(options=options,executable_path=r'geckodriver.exe')
Which would make Firefox headless. However, I need it to display the browser window so that I can do some actions myself, and then switch it back to headless mode. Is there a way to do this, either through Firefox or Selenium, without restarting the driver?

Related

Selenium - Firefox Options Not Taking Effect

I want to change web driver preferences so I can bypass the save/open prompt that pops up when the Firefox webdriver clicks on the download button for a pdf I want.
I am setting the preferences for the Firefox web driver and passing it as a parameter "options" when I initialize the webdriver. It shows that the preferences I enter save into options.preferences but when I have selenium click on the download button on the website, the download prompt for the pdf still pops up.
def __init__(self):
options = webdriver.FirefoxOptions()
options.headless = False
print(options.preferences)
options.set_preference("browser.download.folderList", 2)
options.set_preference("browser.download.manager.showWhenStarting", False)
options.set_preference("browser.download.dir", 'myDir')
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
print(options.preferences)
self.driver = webdriver.Firefox(options = options)
I plan to have this headless, but have it set to False for now. What would be causing the webdriver not to take in the preferences I passed into Options?
Fixed the issue. It seems that the firefox pdf previewer was bypassing the settings I was passing through. The line below blocked the preview of the pdf and allowed the automatic download to take effect.
options.set_preference("pdfjs.disabled", True)

Why does Chrome load old Gmail Sign-in page in headless mode

I have written a Gmail sign-in script using selenium-python.
When i run in the script in firefox headless mode, then the script works fine, without any issues.
But, when i run the same script in chrome headless mode, then the script fails.
I then added screenshots in my code for debugging.
While running in firefox headless mode, the new Gmail Signin UI is displayed
While running in chrome headless mode, the old Gmail Signin UI is displayed
While in chrome headless mode, selenium fails to find the next button with xpath "//div[#id='identifierNext']", since this xpath is of the next button of the new UI.
However, when i run chrome in non-headless mode, then the new Gmail Signin UI is displayed and the scripts does not fail.
I fail to understand, why the old Gmail Signin UI is displayed in chrome headless mode.
Below is the code, (firefox code is commented since i am having issues in only chrome)
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options, executable_path="C:\\chromedriver.exe")
# from selenium.webdriver.firefox.options import Options
# firefox_options = Options()
# firefox_options.headless = True
# driver = webdriver.Firefox(options=firefox_options,executable_path='C:\\geckodriver.exe')
driver.get("https://www.google.com")
print(driver.title)
driver.find_element_by_xpath("//a[text()='Sign in']").click()
driver.get_screenshot_as_file("screenshot1.png")
driver.find_element_by_xpath("//input[#type='email']").send_keys("abcd")
driver.get_screenshot_as_file("screenshot2.png")
self.wait.until(expected_conditions.visibility_of_element_located((By.XPATH, "//div[#id='identifierNext']"))).click()
If anyone has an explanation for this, kindly let me know.
Thanks.

How to minimize or hide the Geckodriver in Selenium?

This is what I have:
from selenium import webdriver
driver = webdriver.Firefox()
How can I let the geckodriver open minimized or hidden?
You have to set the firefox driver options to headless so that it opens minimized. Here is the code to do that.
fireFoxOptions = webdriver.FirefoxOptions()
fireFoxOptions.set_headless()
driver = webdriver.Firefox(firefox_options=fireFoxOptions)
If this doesn't work for you there are other methods that you can use. Check out this other SO question for those: How to make firefox headless programmatically in Selenium with python?
geckodriver
geckodriver in it's core form is a proxy for using W3C WebDriver-compatible clients to interact with Gecko-based browsers.
This program provides the HTTP API described by the WebDriver protocol to communicate with Gecko browsers, such as Firefox. It translates calls into the Firefox remote protocol by acting as a proxy between the local- and remote ends.
So more or less it acts like a service. So the question to minimize the GeckoDriver shouldn't arise.
Minimizing Mozilla Firefox browser
The Selenium driven GeckoDriver initiated firefox Browsing Context by default opens in semi maximized mode. Perhaps while executing tests with the browsing context being minimized would be against all the best practices as Selenium may loose the focus over the Browsing Context and an exception may raise during the Test Execution.
However, Selenium's python client does have a minimize_window() method which eventually minimizes the Chrome Browsing Context effectively.
Solution
You can use the following solution:
Firefox:
from selenium import webdriver
options = webdriver.FirefoxOptions()
options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe'
driver = webdriver.Firefox(firefox_options=options, executable_path=r'C:\WebDrivers\geckodriver.exe')
driver.get('https://www.google.co.in')
driver.minimize_window()
Chrome:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get('https://www.google.co.in')
driver.minimize_window()
Reference
You can find a detailed relevant discussion in:
How to Minimize browser window in selenium webdriver 3
tl; dr
How to make firefox headless programmatically in Selenium with python?

python selenium - how to execute mobile chrome on incognito mode?

I'm trying to implement mobile chrome crawler using python selenium.
And I want to execute mobile chrome on incognito mode.
So, I tried as below.
options = webdriver.ChromeOptions()
## run chrome on incognito mode not to use web cache.
options.add_argument("--incognito")
options.add_experimental_option('androidPackage','com.android.chrome')
driver = webdriver.Chrome(chrome_options=options)
But, mobile chrome was executed on default mode, not incognito mode.
Help me please.
The officially recommended way to launch Chrome on mobile device using Python is this:
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities = chrome_options.to_capabilities())
See if that works for you.
This worked for me:
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--incognito")
driver = webdriver.Chrome("driver path", chrome_options=chrome_options)

Opening a web browser in full screen python

I am currently trying to code a basic smartmirror for my coding II class in high school with python. One thing I'm trying to do is open new tabs in full screen (using chrome). I currently have it so I can open url's, but I am not getting them in full screen. Any ideas on code I can use to open chrome in full screen?
If you're using selenium, just code like below:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://google.com')
driver.maximize_window()
As suggested, selenium is a good way to accomplish your task.
In order to have it full-screen and not only maximized I would use:
chrome_options.add_argument("--start-fullscreen");
or
chrome_options.add_argument("--kiosk");
First option emulates the F11 pressure and you can exit pressing F11. The second one turns your chrome in "kiosk" mode and you can exit pressing ALT+F4.
Other interesting flags are:
chrome_options.add_experimental_option("useAutomationExtension", False)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
Those will remove the top bar exposed by the chrome driver saying it is a dev chrome version.
The complete script is:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("useAutomationExtension", False)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
# chrome_options.add_argument("--start-fullscreen");
chrome_options.add_argument("--kiosk");
driver = webdriver.Chrome(executable_path=rel("path/to/chromedriver"),
chrome_options=chrome_options)
driver.get('https://www.google.com')
"path/to/chromedriver" should point to the chrome driver compatible with your chrome version downloaded from here

Categories

Resources