1
votes

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

3
Just a guess - you got a leading space in your url for the get() method.Grasshopper
Thanks for reply , I also tried with trim but no success. driver.get(element.getAttribute("href").trim());user3302083
I was talking of the driver.get() method -- driver.get(" testsite.com"); -- you have a space at the beginning. The error you are getting seems to mention this line. Try removing the space and check if it worksGrasshopper
YES, to remove this (" testsite.com") leading space, tried with trim function but no luckuser3302083

3 Answers

4
votes

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.

  1. 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 the finalList since they are found earlier and give an exception.

  2. img tags do not have href. 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();
                }
            }
        }
    }
0
votes

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.

0
votes

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>