I added all the links from web-page in Arraylist
and then hit all the URLs one by one.
public class Redirectionlinked1
{
public static List findAllLinks(WebDriver driver)
{
List <WebElement> elementList = new ArrayList();
elementList = driver.findElements(By.tagName("a"));
elementList.addAll(driver.findElements(By.tagName("img")));
List finalList = new ArrayList();
for(WebElement element : elementList)
{
if (element.getAttribute("href") != null)
{
finalList.add(element);
}
}
return finalList;
}
public static void main(String[] args) throws Exception
{
System.setProperty("webdriver.gecko.driver", "E:\Softwares\gecko\geckodriver-v0.16.1-win64\geckodriver.exe");
System.setProperty("webdriver.chrome.driver", "E:\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get(" http://testsite.com");
List <WebElement > allImages = findAllLinks(driver);
System.out.println("Total number of elements found " + allImages.size());
driver = new ChromeDriver ();
URI uri =null;
for (WebElement element : allImages) {
if (!driver.getCurrentUrl().equals(element.getAttribute("href")) && driver.)
{
driver.manage().deleteAllCookies();
driver.get(element.getAttribute("href"));
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Thread.sleep(500);
System.out.println(element.getAttribute("href"));
uri = new URI(driver.getCurrentUrl());
try
{
if(uri.getHost().equalsIgnoreCase("SpecificDomain.net"))
{
System.out.println(" Redirected URL-->> "+element.getAttribute("href"));
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
Code works as expected (it launches the URL in browser) for first link later throws an error :
Exception in thread “main”
org.openqa.selenium.InvalidArgumentException: unknown error:
unsupported protocol
(Session info: chrome=58.0.3029.110)
(Driver info: chromedriver=2.26.436362 (5476ec6bf7ccbada1734a0cdec7d570bb042aa30),platform=Windows NT
6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 131 milliseconds
Build info: version: ‘unknown’, revision: ‘3169782’, time: ‘2016-09-29 10:24:50 -0700’
System info: host: ‘ETPUN-LT009’, ip: ‘192.168.2.193’, os.name: ‘Windows 7’, os.arch: ‘amd64’, os.version: ‘6.1’, java.version:
‘1.8.0_111’
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false,
chrome={chromedriverVersion=2.26.436362
(5476ec6bf7ccbada1734a0cdec7d570bb042aa30),
userDataDir=C:scoped_dir12784_32532}, takesHeapSnapshot=true,
pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true,
hasTouchScreen=false, version=58.0.3029.110, platform=XP,
browserConnectionEnabled=false, nativeEvents=true,
acceptSslCerts=true, locationContextEnabled=true,
webStorageEnabled=true, browserName=chrome, takesScreenshot=true,
javascriptEnabled=true, cssSelectorsEnabled=true,
unexpectedAlertBehaviour=}]
Session ID: df813868289a8f15f947ac620b3b1882
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:164)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:636)
at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:323)
at Practices.Redirectionlinked1.main(Redirectionlinked1.java:99)
My configurations are :-
Chrome – Version 58.0.3029.110 (64-bit)
Geckodriver-v0.16.1-win64
Windows -7
Java – 1.8.1
Upgrade your selenium web driver .It is compatiblity issues with webdriver and your browser version.
I updated my pom file with latest version of chrome web driver and it worked. Upgrading the chrome web driver Version to 3.9.1 and above also resolves the issue.
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>4.0.0-alpha-5</version>
</dependency>
I recently got the error org.openqa.selenium.InvalidArgumentException: invalid argument org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:282)
In my case, it was because I was using Cucumber 5.5.0 & when I tried to pass a full url as a variable in the Scenario Outline data table, Cucumber got confused & caused Selenium to have an error.
This could be because there are links in you website with hre that looks like #
, resources/123.img
which are not complete URLS and triggering a get would result in the exception. You should put a check to ensure the urls are valid. This can be donw by using a comparison using link.startsWith("http://") || link.startsWith("https://")
There are other places also in which you test would fail.
-
finalList
is declared as a List and returned. This ,must be changed to List and should be populated with the link valued. This is because we you have a for loop in which you are calling driver.get(newLink) which would reset all the WebElement objects in thefinalList
since they are found earlier and give an exception. -
img
tags do not havehref
. Instead use ‘src’.
Here is the code after all those changes. Please be aware that there could be other conditions to check whether the URL is valid or not which I have not listed here.
public static List<String> findAllLinks(WebDriver driver) {
// Declare finalList as string.
List<String> finalList = new ArrayList<>();
// Get the a tags
List<WebElement> elementList = driver.findElements(By.tagName("a"));
// get the img tags
elementList.addAll(driver.findElements(By.tagName("img")));
for (WebElement element : elementList) {
// a tags have "href", img tags have src
String link = element.getTagName().equalsIgnoreCase("a") ? element.getAttribute("href")
: element.getAttribute("src");
// Check if link is not null and whether is a valid link by checking
// starts with http or https
if (link != null && (link.startsWith("http://") || link.startsWith("https://"))) {
finalList.add(link);
}
}
return finalList;
}
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.gecko.driver",
"E:\Softwares\gecko\geckodriver-v0.16.1-win64\geckodriver.exe");
System.setProperty("webdriver.chrome.driver", "E:\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://testsite.com");
List<String> allLinks = findAllLinks(driver);
System.out.println("Total number of elements found " + allLinks.size());
driver = new ChromeDriver();
URI uri = null;
for (String link : allLinks) {
if (!driver.getCurrentUrl().equals(link)) {
driver.manage().deleteAllCookies();
driver.get(link);
Thread.sleep(500);
System.out.println(link);
uri = new URI(driver.getCurrentUrl());
try {
if (uri.getHost().equalsIgnoreCase("SpecificDomain.net")) {
System.out.println("Redirected URL-->> " + link);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}