Selenium RC Server opening for Junit - selenium

Is there a way we can start the Selenium RC server without using command prompt?
Also, is there a way of seeing the Log window and Test case window in the same one window?

You may use the following code snippet:
new Thread(new Runnable() {
#Override
public void run()
{
org.openqa.selenium.server.SeleniumServer.main();
}
}, "SeleniumServer").start();
Or much simpler in Groovy:
new Thread({ org.openqa.selenium.server.SeleniumServer.main(); }, "SeleniumServer").start()

This may sound a bit random, but I would suggest using maven to control your build and test process. There is a nice plugin for Selenium in maven that will control the startup/shutdown of the server. Maven will provide you with many other added benefits.

Related

Selenium - Automated Testing and Edge

Can someone point me to a website or information that discusses how to setup Selenium and write automated scripts? I need to write scripts to test a web based application. I know how to use Java and would like to do that approach.
Thanks
From the description, it looks like you want to automate the MS Edge (Chromium) browser using Selenium web driver.
I suggest you refer to the steps below.
Download the Java binding of Selenium 4.0.0-beta-1 from here.
Download the matching version of Microsoft Edge Driver from this page.
Create a new JAVA project and try to add a reference to the Java binding files by Right-click the project folder-> Build path-> Configure Build path-> Libraries tab-> Add External JARs.
Add the code below to your JAVA project.
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
public class test {
public static void main(String[] args)
{
System.setProperty("webdriver.edge.driver", "Edge_web_driver_path_here....\\msedgedriver.exe"); //Modify path here...
EdgeOptions edgeOptions = new EdgeOptions();
//edgeOptions.addArguments("-inprivate");
WebDriver driver = new EdgeDriver(edgeOptions);
driver.get("https://Website_URL_here..."); //Modify URL here...
//--------------------------------------
//Your_Automation_code_here....
//--------------------------------------
driver.quit();
}
}
Run the code.
Output:
Further, you can try to modify the code example as per your requirements.

Selenium/Chromedriver automation hanging when run as executable

I am trying to create a simple automation task. For now I want to log in to the webpage. This all works fine when I run the test in Visual Studio 2017. However this will need to be executed as an exe on regular interval in windows system. When I run the executable it hangs after displaying:
Starting ChromeDriver 2.32.498550 (9dec58e66c31bcc53a9ce3c7226f0c1c5810906a)
on port 9515
Only local connections are allowed.
I understand this is just info not an error per most SO posts related to this issue such as - When running WebDriver with Chrome browser, getting message, "Only local connections are allowed" even though browser launches properly
(note: my browser does not launch)
How do I run the test code as an executable?
Do I have to write additional code to invoke the test when running as executable?
Nuget Version Info
namespace RevuSeleniumAutomation
{
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.PhantomJS;
using System;
[TestClass]
public class RevuAutomater
{
private string baseURL = "http://example.com/";
private RemoteWebDriver driver;
private string browser;
public TestContext TestContext { get; set; }
[TestMethod]
[TestCategory("Selenium")]
[Priority(1)]
[Owner("Chrome")]
public void AutomateSite()
{
driver = new ChromeDriver();
driver.Manage().Window.Maximize();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
driver.Navigate().GoToUrl(this.baseURL);
driver.FindElementById("UserName").SendKeys("user");
driver.FindElementById("Password").SendKeys("12345");
}
[TestCleanup()]
public void MyTestCleanup()
{
driver.Quit();
}
[TestInitialize()]
public void MyTestInitialize()
{
}
}
}
The cmd window message after launching exe
Thank you for your time.
To run as EXE I think there are two options:
1) not with selenium server or grid
. you need package the chromedriver.exe with your code into the EXE
. you code need to calculate the path of chromedriver.exe in runtime, because you don't know user will put the EXE in which folder
. specify chromedriver.exe by ChromeOptions to tell selenium where to find it when create driver instance
Shortage of this way: a chromedriver.exe of certian version support limited chrome verions, not all chrome verions, you need to tell user which chrome the EXE support.
2) use selenium server/grid
. you code need accept selenium server/grid address from a config file which user can modify it
. create RemoteWebDriver instance with above address, not ChromeDriver in code
. no need to package chromedriver.exe with your code
Shortage of this way: A selenium server/grid need be ready before execute EXE,
But your code no need to consider the compatibility of chrome and chromedriver.exe, because they had been considered when setup selenium server/grid.

Running a WebDriver Test without using ANT, Maven, JUnit or Eclipse

I would like to know if it's possible to run a WebDriver test in Java using just a plain text editor, Firefox browser, Java SDK and WebDriver JAR?
I am trying to come up with the most "bare-metal" way to run a test without adding Test Runners, Test Frameworks, Dependency Managers into the mix.
I understand that this is not the "right" way to do things, but I am trying to find a way to create a new kind of WebDriver tutorial that will focus only on the API.
I am using OS X right now but instructions for Windows would be equally appreciated.
Running WebDriver is as simple as
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Test {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com");
}
}
The only thing that you need is a correct classpath, which is just selenium-java-2.38.0.jar and supporting libraries, namely: guava-15.0.jar json-20080701.jar commons-exec-1.1.jar httpcore-4.3.jar httpclient-4.3.1.jar commons-logging-1.1.1.jar
Or, as per JimEvans, you can download standalone selenium-server-standalone-2.40.0.jar that has all dependencies included.
Firstly record and run the script you want to do then export it as junit4 test suite and save. Second copy the full code and aste it in eclipse then you can get the option "Run as junit4 test" while running code.

Using Selenium 2.0 WebDriver in practice

I want to write Selenium test cases in JUnit and test my projects in multiple browsers and I would like to take advantage of the fact that all Selenium drivers implement the same interface.
Each test case should look like this:
package fm;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import static org.junit.Assert.*;
public class HomepageTest {
#Test
public void testTitle(WebDriver driver) {
driver.get("http://localhost/");
assertEquals("Foo", driver.getTitle());
}
#Test
public void testSearchForm(WebDriver driver) {
//...
}
}
The passed WebDriver implementations should be controlled somewhere centrally. I'll probably need to override some of the JUnit behaviour and I hope it's possible.
I want to do it this way in order to avoid two things:
Code repetition: If each test case would initialize all tested browsers in #Before, the test suite would have a lot of repeated code that is hard to maintain.
Speed of the test suite: If I had centralized control over the order and passed WebDriver implementations, I could easily manage to open for example Firefox, run all test cases in it, close it and open the next browser. If each test case would manage to open and close browsers on its own, it would add a lot of time to each test run.
Anybody have an idea how should I do it? Thanks.
In the Selenium project we inject what we need using http://code.google.com/p/selenium/source/browse/trunk/java/client/test/org/openqa/selenium/AbstractDriverTestCase.java and then our build calls the browser and we get tests running in it.
Have a look at our code base to get some inspiration!
Please check with ISFW it supports selenium webdriver/remote webdriver as well as conventional (selenium1) rc way.
You need to write code using regular selenium api
for example
selenium.open(url);
selenium.type("loc", "text to type");
selenium.submit("loc");
Here is the working demo. Set browser String as per your requirement.
The FW support selenium conventional way as well as selenium 2 webdriver. You need to set appropriate browser string in application properties. Following are different browser configurations for Firefox:
*firefox - required selenium server running on configured host/port
if not found then fw will check/start one on locahost/port
firefoxDriver – will run directly with firefox web driver without
selenium server
firefoxRemoteDriver - required selenium server running on
configured host/port if not found then fw will check/start one on
locahost/port, it will run test using firefox web driver on host
machine
Same way for IE - *iexplore, *iehta, iexplorerDriver, iexplorerRemoteDriver
and so on.
I did what you are/were? trying to do with a static class that controlls the webdriver and all my test which need the same webdriver get it from there. It really helps when you are running multiple tests that need to use the same session. And all your tests run in one browser, so not every tests opens a new browser instance.
Maybe you should also have a look at testNG. I made the experience that testNG is better for tests with selenium since it is not so focused on independent tests. It offers a lot of useful functionality.

How to skip tests in PHPUnit if Selenium server is not running?

I want to add a suite of Selenium tests as part of a global PHPUnit test suite for an application. I have hooked the suite of Selenium tests into the global AllTests.php file and everything runs fine whilst the Selenium server is running.
However, I would like the script to skip the Selnium tests if the Selenium server isn't running so other developers aren't forced to install Selenium server in order for the tests to run. I would normally try to connect within the setUp method of each testcase and mark the tests as skipped if this failed, but this seems to throw a RuntimeException with message:
The response from the Selenium RC server is invalid: ERROR Server Exception: sessionId should not be null; has this session been started yet?
Does anyone have a method for marking the Selenium tests as skipped in this scenario?
You could use test dependencies that were introduced in PHPUnit 3.4.
Basically
write a test that checks whether Selenium is up.
If not, call $this->markTestAsSkipped().
Make all your selenium requiring tests depend on this one.
My preferred selenium / PHPUnit Configuration:
Maintaining integration (selenium) tests can be a lot of work. I use the firefox selenium IDE for developing test cases, which doesn't support exporting test suites to PHPUnit, and only supports individual test cases. As such - if I had to maintain even 5 tests, that'd be a lot of manual work to re-PHPUnit them every time they needed to be updated. That is why I setup PHPUnit to use Selenium IDE's HTML Test files! They can be reloaded & reused between PHPUnit & selenium IDE
<?php
class RunSeleniumTests extends PHPUnit_Extensions_SeleniumTestCase {
protected $captureScreenshotOnFailure = true;
protected $screenshotPath = 'build/screenshots';
protected $screenshotUrl = "http://localhost/site-under-test/build/screenshots";
//This is where the magic happens! PHPUnit will parse all "selenese" *.html files
public static $seleneseDirectory = 'tests/selenium';
protected function setUp() {
parent::setUp();
$selenium_running = false;
$fp = #fsockopen('localhost', 4444);
if ($fp !== false) {
$selenium_running = true;
fclose($fp);
}
if (! $selenium_running)
$this->markTestSkipped('Please start selenium server');
//OK to run tests
$this->setBrowser("*firefox");
$this->setBrowserUrl("http://localhost/");
$this->setSpeed(0);
$this->start();
//Setup each test case to be logged into WordPress
$this->open('/site-under-test/wp-login.php');
$this->type('id=user_login', 'admin');
$this->type('id=user_pass', '1234');
$this->click('id=wp-submit');
$this->waitForPageToLoad();
}
//No need to write separate tests here - PHPUnit runs them all from the Selenese files stored in the $seleneseDirectory above!
} ?>
You can try skipWithNoServerRunning()
For more information follow this link