What is difference between Xvfb and Chromedriver and when to use them - selenium

Hi I am planning to setup selenium to test my web application.
I have read that both chromedriver and Xvfb can be used to run the tests.
I have also read that Xvfb can be configured to use chromdriver.
So that got me confused. What role does chromedriver and Xvfb in runnning the selenium tests.
Thanks

chromedriver - to run tests on chrome browser (with GUI).
Xvfb - to run tests in headless mode. can be any browser including chrome (Browser GUI won't be displayed, so you can use the machine for some other operations).
code snippets (python):
Chrome Driver (download here):
browser = webdriver.Chrome() // to launch tests in Chrome browser.
Xvfb - using pyvirtualdisplay (python wrapper for Xvfb) :
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(800, 600))
display.start()
# now Chrome will run in a virtual display.
# you will not see the browser.
browser = webdriver.Chrome()
browser.get('http://www.google.com')
print browser.title
browser.quit()
display.stop()
References:
How do I run Selenium in Xvfb?

Related

ChromeDriver doesn't open in jenkins

I created a selenium cucumber framework that has a test.
The test needs to open chromeDriver, and it is working when I run it in my IDE without any problems.
When I run the project in Jenkins, although the test runs, the chromeDriver doesn't open at all.
The console log is:
17:32:14 Starting ChromeDriver 89.0.4389.23
(61b08ee2c50024bab004e48d2b1b083cdbdac579-refs/branch-heads/4389#{#294})
on port 4816
17:32:14 Only local connections are allowed.
17:32:14 Please see
https://chromedriver.chromium.org/security-considerations for
suggestions on keeping ChromeDriver safe.
17:32:14 ChromeDriver was started successfully.
Of course, this log is shown in my ide with the difference that chromeDriver opens in IDE mode and doesn't open in Jenkins mode.
What can I do?
First of all you should add more description, like:
what language do you use?
how start driver in your code?
do you use local driver or remote one?grid or selenoid?
do you use --headless mode on jenkins?
does jenkins have Xs for running browser?
There's bunch of solving, but each of them is based on more particular description:
Best way, but a bit tricky/expensive:
launch own Grid/Seleloid server on ec2 instance on any cloud platform you like: GCP, AWS, Azure, DigitalOcean etc
install docker and launch selenoid intance
launch selenoid application by downloading from github release page:
chmod +x cm
./cm selenoid start --vnc
get its IP and provide it to your driver creation command
which looks like that:
java:
WebDriver driver = new RemoteWebDriver(new URL(SelenoidIP/wd/hub), firefoxOptions);
driver.get("http://www.google.com");
driver.quit();
ruby:
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :remote, url: SelenoidIP/wd/hub
driver.get "http://www.google.com"
driver.close
python:
from selenium import webdriver
driver = webdriver.Remote(
command_executor=SelenoidIP/wd/hub)
driver.get("http://www.google.com")
driver.quit()
Update:
I found a better solution.
Start Jenkins as a process from command line, not as a service, to get Chrome to open.
https://stackoverflow.com/a/41457823/1691651
command line commands:
Jenkins.exe stop
java -jar Jenkins.war
To save your Jenkins configurations, create an Environment Variable for JENKINS_HOME that points to location listed on the "Configure Jenkins" setting.
Old answer:
This also happened to me in webdriver.io when using the "chromedriver" service. To solve it, I had to manually download the chromedriver at https://chromedriver.chromium.org/downloads and then run it via a terminal--I don't know why that fixed it.
I don't need to run chromedriver separately in a terminal when testing via command line on the same EC2 instance.

How to use Headless Chrome Selenium on PythonAnywhere?

"Using Selenium on PythonAnywhere" says:
Firefox only, selenium 2, geckodriver not required (…)
That (Firefox v17.0) is quite an old version, but it
works for most sites.
In my case it did not work. Is there a way to use Google Chrome (headless) anyway on PythonAnywhere?
I found this forum entry with the hint that it is not only possible to use Chrome, but even "You'll need to upgrade Selenium to the most recent version".
I simply wrote an email to the PythonAnywhere support and they enabled that for my (payed) account within hours.
Don't forget to start a new console or restart your web app! Then the following code should work:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
browser = webdriver.Chrome(options=chrome_options)
try:
browser.get("https://www.google.com")
print(f'Page title was {browser.title}')
finally:
browser.quit()

JMeter WebDriver Sampler - headless Firefox

Is it possible to run Firefox headless with WebDriver Sampler? I have used the "Use Chrome headless mode" option with Chrome before, but I don't see that option in Firefox Driver Config.
Perhaps this can be done in the actual sampler, by setting options to 'browser' in the code below?
WDS.sampleResult.sampleStart()
WDS.browser.get('http://jmeter-plugins.org')
WDS.sampleResult.sampleEnd()
Thank you.
There is no easy/GUI way of doing this using WebDriver Sampler (unless you patch FirefoxDriverConfig to include FirefoxBinary and pass to it --headless argument like:
FirefoxBinary firefoxBinary = new FirefoxBinary();
firefoxBinary.addCommandLineOptions("--headless");
Another option would be switching to JSR223 Sampler to initialise the FirefoxDriver class yourself from the scratch.
More information: Firefox - Headless Mode
And last but not the least, if you're about to execute your Selenium tests on i.e. Linux machine which doesn't have GUI you can create a virtual display using Xvfb so Firefox would run attached to this virtual desktop. See Headless Execution of Selenium Tests in Jenkins for more details on implementing this on different operating systems.

Google chrome closes automatically after launching using Selenium Webdriver

I am on Windows 10 using Selenium with Python 3.7.3.
If I wrap the code inside a class , the browser terminates immediately after opening the page:
'''
Program to show how to open chrome browser using selenium webdriver
'''
from selenium import webdriver
#import os
class run_chrome_tests(object):
def test_method(self):
# This is the location of the chrome driver saved into a variable
#driver_location = "D:\\Udemy_Python\\Libs\\chromedriver.exe"
# Letting the system environment know the location of the chrome driver
#os.environ["webdriver.chrome.driver"] = driver_location
# Letting the chrome browser know the location of the chrome driver
driver = webdriver.Chrome()
driver.get("http://www.letskodeit.com")
ch = run_chrome_tests()
ch.test_method()
Check the Version of the Chrome Browser and the Version of the chrome Driver , if the driver is not compatible then browser terminates just after opening,try using the latest version for both
By default, the chrome window will shutdown automatically, after it finishes all the instruments, unless you set the option to prevent this explicitly.
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=options)
driver.get("http://www.bing.com")
However, there is another possibility that you had chosen a WRONG version of chrome driver. The following is on how to select the right version of the chrome driver:
In the address bar of your chrome browser, type chrome://version. The first line of the returned page will be the version number.
Download one version of the chrome driver from this page. (https://chromedriver.storage.googleapis.com/index.html). Select the version that matches the version of your chrome as much as possible. (Very Important)

Do headless web browser need selenium WebDriver?

I am trying to use headless web browser(such as headless chrome) for our selenium tests.Should I have to use selenium WebDriver(for python or c# bindings)?
Headless Chrome
As per Getting Started with Headless Chrome the Headless Chrome is the server environment where you don't need a visible UI shell.
If you've got Chrome 59+ installed, you start Chrome with the --headless flag as follows:
chrome \
--headless \ # Runs Chrome in headless mode.
--disable-gpu \ # Temporarily needed if running on Windows.
chrome should always point to your installation of Chrome. The exact location of-coarse varies from platform to platform.
ChromeDriver
As per ChromeDriver - WebDriver for Chrome, in simple words WebDriver is an open source tool for automated testing of webapps across many browsers which provides capabilities for navigating to web pages, user input, JavaScript execution, and much more. ChromeDriver is the standalone server which implements WebDriver's wire protocol for Chromium.
Conclusion
If you intend to use Chrome Browser in Headless Mode(i.e. Headless Chrome) for your selenium tests you have to mandatorily use ChromeDriver
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
Before we set up a Chrome web driver instance, we have to create an Options object that allows us to specify how exactly we want to launch Chrome. Let’s tell it that we want the browser to launch headless and that the window size should be set to 1920x1080. We also need ChromeDriver to be able to run Chrome at all 
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920x1080")
# download the chrome driver from https://sites.google.com/a/chromium.org/chromedriver/downloads and put it in the
# current directory
chrome_driver = os.getcwd() +"\\chromedriver.exe"
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome_driver)
driver.get("https://www.google.com")