I develop a program, which checks browser plugin behaviour [ in python & selenium ]. The plugin is a black box to me I just have it installed in browsers.
For example, in Firefox, i've installed it to my profile and force webdriver to open firefox with desired profile. I've made the same witch chrome, and it obviously loads the profile, but not the extension.
opt = webdriver.ChromeOptions()
opt.add_argument("--user-data-dir=C:\\Users\\..\\Google\\Chrome\\User Data\\Profile 2\\")
driver = webdriver.Chrome("C:\\...\\chromedriver.exe", chrome_options=opt)
Is there any way how to make this functionallity work? Or is the problem, that the extension are bound to the logged user, not profile of browser?
What I need to do is to execute chrome with specified url, let the plugin to analyze the site and then check plugin's output.
Another problem is that I am not the one who will use the program, so I wouldn't like to start force user to pack crx extenstion (or is there a simple way to this?). My requirments is that thare is one or two items in configuration file, like
chrome-profile: path/to/profile
Thank you for any advice.
Related
I am new to python selenium and I need more explanation on the effect of the below code on selenium Firefox profile.
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', ('application/vnd.ms-excel'))
Firefox browser is by default asking if to save or to open the file when user tries to download a file.
To prevent Firefox opening that dialog we can predefine not to ask this for predefined types of files.
Each file type should be mentioned explicitly with such setting in order to not ask when downloading of such a kind of file initiated.
Basically when setting up your Firefox profile you add a call to set the property browser.helperApps.neverAsk.saveToDisk like this.
You won't face download pop up.
so basically it means that download any file and save it to the desired location using Selenium Webdriver.
I would like to create a new session for each tab I open and then control the sessions individually using Selenium python. Is this possible?
#reynoldsnp: Firefox has an official addon that does this, but I'm not sure if you can get selenium to interact with the addon. addons.mozilla.org/en-GB/firefox/addon/multi-account-containers If you figure out a way to do it, I would love to know how.
(I can't comment yet due to my reputation score, therefore quoted comment).
I don't know how to actually interact with the extension but if you have a known set of sites you would like to open:
Try this:
Make a firefox profile for your use with selenium. Multiple profiles
Windows 8/8.1/10:
Press Win + R on your keyboard.
Type firefox --new-instance --ProfileManager
Open Firefox in that profile by selecting the new profile in the setup wizard. Install the extension in that profile.
Set up the containers you would like in the extension, to, by default, open up with a specific site.
Ensure that the checkbox is ticked.
Start selenium with that profile like this:
from selenium import webdriver
profile = webdriver.FirefoxProfile('path/to/your/profile') # on windows found here: %APPDATA%/Mozilla/Firefox/Profiles
driver = webdriver.Firefox(firefox_profile=profile)
Navigate between tabs, effectively containers, using selenuium.
First, no, you cannot. While tabs runs as a process, they are attached to the session ID which initially open the browser. This is how the protocol works https://www.w3.org/TR/webdriver/#new-session
They have, however, a unique ID which you can use to identify them by and switch between them.
driver.window_handles
will give you the list of open tabs. Each tab is fully isolated. You can now choose between
driver.switch_to_window("any open tab taken from windows handles list")
driver.do_something
driver.switch_to_window("any other tab from windows handles list")
driver.do_something_else_on_other_tab
# or (this option can let you run in parallel)
driver a = ChromeDriver()
driver b = ChromeDriver()
a.do_something
b.do_something
As suggested (and I personally do myself) open new session for each tab you want, that way you can parallel them and run much faster, all in all.
I am not sure the performance difference is that significant between multiple browsers or multiple tabs... they should use almost the same resources.
I want to be able to use pure selenium webdriver to open a zoom link in Chrome and then redirect me to the zoom.us application.
When I execute this:
from selenium import webdriver
def main():
driver = webdriver.Chrome()
driver.get("https://zoom.us/j/000-000-000")
main()
I receive a pop-up saying
https://zoom.us wants to open this application.
and I must press a button titled open zoom.us to open the app.
Is there a way to press this pop-up button through selenium. Or, is there some other way to open zoom from chromedriver?
NOTE: I only want to use selenium. I have been able to implement pyautogui to click on the button but that is not what I am looking for.
Solution for Java:
driver.switchTo().alert().accept();
Solution for Python:
driver.switch_to.alert.accept()
There are a lot of duplicated questions regarding this issue. Here is one of them, and it is quite sure that selenium is not capable of achieving such job since it only interacts with the chrome page. I previously encountered this issue as well and here is my solution to it. It might look really unprofessional, but fortunately it works.
The logic of my solution is to change the setting of chrome in order to skip the popup and directly open the application you want. However, the Chrome team has removed this feature in the latter version for some reasons, and we need to get it back manually. Then, we know that everytime when selenium starts to do the thing it opens a new Chrome page with NO customized settings just like the incognito page. Therefore we need to do something to let selenium opened a Chrome page with your customized setting, so that we can make sure that the popup, which we changed manually to skip, can be skipped successfully.
Type the following code in your terminal.
defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool true
This enables you to change the setting of skipping popups, which is the feature Chrome team removed.
Restart Chrome,and open the zoom (or whatever application) page to let the popup display. If you do the 1st step correctly you will be able to see there is a checkbox shown next to the "Open Zoom.us" saying if you check it chrome will open this application without asking, that is, to skip the popup for this application.
Now we need to let selenium open the Chrome with our customized setting. To do this, type "chrome://version" in the search tab of your ordinary Chrome (Not automated page opened by selenium). Go to "Profile Path", and copy this path without the last word "default". For example:
/Users/MYNAME/Library/Application Support/Google/Chrome/Default
This is my profile path, but I only copy everything except the last word Default, so this is what I need to copy.
/Users/MYNAME/Library/Application Support/Google/Chrome/
This is for Mac users, but for Windows only the path is different(starts with C:// or something), steps are same.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
option = Options()
option.add_argument('THE PATH YOU JUST COPIED')
driver = webdriver.Chrome(executable_path='YOUR PATH TO CHROMEDRIVER', options=option)
driver.get("google.com") #Or anything else
We use "options" to let selenium open a page with our customized profile. Now you will see selenium opens a Chrome page with all your account profile, settings, and it just appears like your ordinary chrome page.
Run your code. But before that, remember to quit ALL CHROME sessions manually. For Mac, make sure that there is no dot under Chrome icon indicating that Chrome is not running for any circumstances. THIS STEP IS CRITICAL otherwise selenium will open a chrome page and it just stops there.
Here are all the steps. Again, this solution is vert informal and I personally don't think it is a "solution" to this problem. I will try to figure out a better way of achieving this in the future. But I still posted this as an alternative simply because I guess it might be helpful to some extent for somebody just like me. Hope it works for you, and good luck.
Hello to stack overflow community. I've been looking for a solution to permanently change the default download path of browsers (chrome, firefox and edge) to the one i specify in my python script. So far this python script is tested with chrome, which does not provide the desired results!
from selenium import webdriver
chromeOptions = webdriver.ChromeOptions()
prefs = {"download.default_directory" : "/some/path"}
chromeOptions.add_experimental_option("prefs",prefs)
chromedriver = "./chromedriver"
driver = webdriver.Chrome(executable_path=chromedriver, chrome_options=chromeOptions)
What essentially this script does is, open a new chrome window and change its download path to one specified in the script! Changes made are, just limited to this opened window that are discarded on window closing.
It seems to be creating some sort of session which certainly does not affect the original/default window's settings!
I might not have used the proper words/terms to describe the problem, please let me know if my problem is not clear enough!
Edit: In my case, use of selenium does not matter/necessary, what i want is a more generalized solution(plug and play) that on running(script) changes the path and does not need any setup of profile paths or binaries which is the case with selenium!
You can load default profiles and with all your configurations.
You can find detailed instructions how to load default profile to Chrome here:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir=C:\\Path") #Path to your chrome profile
w = webdriver.Chrome(executable_path="C:\\Users\\chromedriver.exe", chrome_options=options)
I have reproduced the problem on my machine, it seems that by changing the ChromeOptions and the prefs option using selenium, we could only change the selenium opened window setting, instead of the Chrome browser Default setting.
To permanently change the default download path of browsers (Chrome, Firefox and edge) to the one I specify in my python script. I suggest you could directly change the download path from the registry (without using the selenium webdriver).
For example, the chrome Registry path as below:
Then, we could use the following code to change the registry key value.
import winreg
key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, 'Software\Policies\Google\Chrome')
winreg.SetValueEx(key, 'DownloadDirectory', 0, winreg.REG_SZ, 'D:\TempData')
key.Close()
The result like this:
For the Microsoft Edge browser, the download folder Registry path is:
Computer\HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Main (set the Default Download Directory key value, like this)
or set the user shell folders:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
Then, we can use the following code to modify the registry key value.
import winreg
key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders')
winreg.SetValueEx(key,'{374DE290-123F-4565-9164-39C4925E467B}', 0, winreg.REG_SZ, 'D:\TempData')
key.Close()
[Note] When using this method to modify the browser setting, it is better have the Admin permission.
Where can I find a list of all available Chrome Options with selenium?
While crawling with selenium in a python environment, I had to use flash in the chrome webdriver.
so I tried to find a setting that would allow Flash and I found these answers.
https://sqa.stackexchange.com/questions/30312/enable-flash-player-on-chrome-62-while-running-selenium-test
Selenium.Chrome where can I find a list of all available ChromeOption arguments? C#
but I really want to find official document
about these arguments :
profile.default_content_setting_values.plugins
profile.content_settings.plugin_whitelist.adobe-flash-player
I think that exist because some people said like above two answers.
but I can't found it.
Here are the links of the most widely used ChromeDriver properties and ChromeOptions:
ChromeDriver - WebDriver for Chrome: Capabilities & ChromeOptions
Peter Beverloo: List of Chromium Command Line Switches
Chromium Project: Chrome Preferences
Chromium Project: Chrome Switches
open chrome://version in chrome address bar
open the folder of Profile Path:, there will be a file perference
copy and open the perference file, it's a JSON file, you can use JSON formater or JSON viewer online.
important, please open the copied one to avoid break your chrome if you did changes.
I think the configuration related to flash under profile.content_settings
open chrome://settings/content/flash in chrome address bar, do waht you wanted settings for flash, your changes will be updated into perference file,
Find out the difference between the updated and copied perference file.
The difference should be you wanted chrome perference.
set perference when build ChromeOptions, like profile.content_settings.xxx=xxx
Alternative, you can pre-config the flash settings(chrome://settings/content/flash) in current user profile and use user profile to build ChromeOptions.
Some reference:
Manage Flash in Chrome
Default user preferences
Preferences vs. Policies
Policy List
Policy List - DefaultPluginsSetting
Policy more close to using registry/system level setting to effect all users in one machine; Preference work under user profile only effect one user, user can use it to customize upon Policy settings. But Policy has higher priority than Preference.