2

Ima trying to click all the elements present in the Html

http://www.flipkart.com/ Under this Electronics -> Shop by Categories ->

below is the sample part of the Html

<a class="" data-tracking-id="0_Samsung" href="/mobiles/samsung~brand/pr?sid=tyy,4io&amp;otracker=hp_nmenu_sub_electronics_0_Samsung">Samsung</a>

<a class="" data-tracking-id="0_All Brands" href="/mobiles/pr?sid=tyy,4io&amp;otracker=hp_nmenu_sub_electronics_0_All%20Brands">All Brands</a>


<a class="" data-tracking-id="0_All Brands" href="/laptops/pr?sid=6bo,b5g&amp;otracker=hp_nmenu_sub_electronics_0_All%20Brands">All Brands</a>

iam clicking using below

 WebElement ul = driver.findElement(By.id("menu-electronics-tab-0-content"));
       List<WebElement> lis = ul.findElements(By.tagName("li"));
       System.out.println(""+lis.size());
       String[] linksText = new String[lis.size()];
       int index = 0;
       for(WebElement element : lis){

           linksText[index] = element.getText();

        String string = linksText[index];

        if(string.contains(" ")){
            linksText[index]= string.substring(0, string.indexOf(" ")); 
        }

           index++;
       }     
               for(index =0; index < linksText.length; index++){
           String xpath = "//*[contains(@href,'%s')]";
           String y = linksText[index];
                   String xpathOfElement = String.format(xpath, String.valueOf(y));
                      System.out.println("Name 1  "+driver.findElement(By.xpath(xpathOfElement)).getText());
                   driver.manage().timeouts().implicitlyWait(50000, TimeUnit.MILLISECONDS);

                          driver.findElement(By.xpath(xpathOfElement)).click();

When iam running the code it is proceeding till i = 12 till HP after that it is throwing an error. there are 83 Elements present. i need to click and navigate back

Name 1  Mobiles
Name 1  Bluetooth Headsets
Name 1  Laptops
Name 1  Apple
Name 1  
FAILED: Electronic
org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with
Command duration or timeout: 50.20 seconds
Build info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:11:15'
System info: host: 'VALUED-8JGOG5PH', ip: '192.168.1.4', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_45'
Session ID: 7d9304d9-fe1a-444d-b6b6-4669bfc46a33
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, cssSelectorsEnabled=true, databaseEnabled=true, browserName=firefox, handlesAlerts=true, browserConnectionEnabled=true, webStorageEnabled=true, nativeEvents=true, rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true, takesScreenshot=true, version=26.0}]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:268)
    at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:79)
    at Examples.FlipkartTest2.Electronic(FlipkartTest2.java:64)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: Element is not currently visible and so may not be interacted with
Build info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:11:15'
System info: host: 'VALUED-8JGOG5PH', ip: '192.168.1.4', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_45'
Driver info: driver.version: unknown
    at <anonymous class>.fxdriver.preconditions.visible(file:///C:/Users/ADMINI~1/AppData/Local/Temp/anonymous281959659031274025webdriver-profile/extensions/[email protected]/components/command_processor.js:8179)
    at <anonymous class>.DelayedCommand.prototype.checkPreconditions_(file:///C:/Users/ADMINI~1/AppData/Local/Temp/anonymous281959659031274025webdriver-profile/extensions/[email protected]/components/command_processor.js:10814)
    at <anonymous class>.DelayedCommand.prototype.executeInternal_/h(file:///C:/Users/ADMINI~1/AppData/Local/Temp/anonymous281959659031274025webdriver-profile/extensions/[email protected]/components/command_processor.js:10831)
    at <anonymous class>.fxdriver.Timer.prototype.setTimeout/<.notify(file:///C:/Users/ADMINI~1/AppData/Local/Temp/anonymous281959659031274025webdriver-profile/extensions/[email protected]/components/command_processor.js:396)

is there any alternate method other than href to click the Link.

2
  • Have you tried finding the elements by their XPath value? Commented Feb 13, 2014 at 16:12
  • correct me if iam wrong xpath value will be same for certain elements like "All Brands" Commented Feb 13, 2014 at 16:33

1 Answer 1

2

Here is an optional solution for you:

  1. Iterate all the links, and save the values of their <href> attributes in a list.
  2. Iterate the list generated on the previous step, and navigate you browser to each URL.

Doing it this way will ensure that your code does not depend on the WebElement objects that you read from the DOM of the original web-page, and once you've collected all the URLs, you no longer need to remain on this web-page.

Step #1:

Before iterating lis, add ArrayList<String> urls = new ArrayList<String>();

Step #2:

Replace driver.findElement(By.xpath(xpathOfElement)).click();

With urls.add(driver.findElement(By.xpath(xpathOfElement)).getAttribute("href"));

Step #3:

After iterating lis, navigate to each URL:

for (String url : urls)
    driver.get("http://www.flipkart.com"+url);
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks but getting one error for the link org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":"//*[contains(@href,'Mixer/Juicer/Grinders')]"} Command duration or timeout: 50.21 seconds For documentation on this error, please visit: seleniumhq.org/exceptions/no_such_element.html how to solve it ?
The Mixer/Juicer/Grinders string is in the element's text. In the element's href, it is a mixer-juicer-grinders string. So in contains(@href,'Mixer/Juicer/Grinders') - either change href to innerHTML, or change Mixer/Juicer/Grinders to mixer-juicer-grinders.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.