user900481
user900481

Reputation:

Click on element of a dynamic loaded page using Selenium WebDriver java

I need to click on particular element of an dynamically loaded page.Web element generated when we scroll the page.It similar like an jabong webpage.

I try to do that on jabong webpage this is my code

    WebDriver driver = new FirefoxDriver();
    driver.manage().window().maximize();
    driver.navigate().to("http://www.jabong.com/men/clothing/"
            + "?source=topnav");


    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    System.out.println("Close the modal popup");
    driver.findElement(By.id("jab-vchr-cls")).click();
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);

      /**
       * while(true) loop is required to search the 
       * element until element found.We put find
       * element within try-catch and if it get 
       * exception it scroll the page and again 
       * try to find the element.
       */
    while(true) {

            ((JavascriptExecutor)driver).executeScript("window.scrollBy(0,100)", "");
        try {
            WebElement element = driver.findElement(By.xpath("//*[@id='http:    //static3.jassets.com/p/The-Indian-Garage-Co.-Checks-Red-Casual-Shirt-2889-679124-1-catalog.jpg']/img"));
            Wait<WebDriver> wait_element=new WebDriverWait(driver, 10);
            wait_element.until(ExpectedConditions.elementToBeClickable(element));
            element.click();
            System.out.println("!!!!!!!!!!!!!!At Last Get Success!!!!!!!!!!!!!!!!");
            break;

        }
        catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex.getMessage());
        }
        }

} }

My question is

1.Is there any better way to do this things?

2.How to make this script faster?

Upvotes: 3

Views: 4753

Answers (2)

saba
saba

Reputation: 539

you can do this way if you want to avoid while(true) though I donot think there is any problem with this loop.

    boolean reachedbottom = Boolean.parseBoolean(js.executeScript("return $(document).height() == ($(window).height() + $(window).scrollTop());").toString());

    while (!reachedbottom) {
        ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,600)", "");
        try {
            reachedbottom=Boolean.parseBoolean(js.executeScript("return $(document).height() == ($(window).height() + $(window).scrollTop());").toString());
            WebElement element = driver.findElement(By.xpath("//*[@id='http://static3.jassets.com/p/The-Indian-Garage-Co.-Checks-Red-Casual-Shirt-2889-679124-1-catalog.jpg']/img"));
            Wait<WebDriver> wait_element = new WebDriverWait(driver, 5);
            wait_element.until(ExpectedConditions.elementToBeClickable(element));
            element.click();
            System.out.println("!!!!!!!!!!!!!!At Last Get Success!!!!!!!!!!!!!!!!");
            break;
        } catch (Exception ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex.getMessage());
        }
    }

Upvotes: 2

ddavison
ddavison

Reputation: 29032

  1. In the Getting Started with Selenium framework, the AutomationTest#waitForElement method is a great way to handle things. It's an alternative to the webdriver wait, but works all the same.

    /**
     * Private method that acts as an arbiter of implicit timeouts of sorts.. sort of like a Wait For Ajax method.
     */
    private WebElement waitForElement(By by) {
        int attempts = 0;
        int size = driver.findElements(by).size();
    
        while (size == 0) {
            size = driver.findElements(by).size();
            if (attempts == MAX_ATTEMPTS) fail(String.format("Could not find %s after %d seconds",
                                                             by.toString(),
                                                             MAX_ATTEMPTS));
            attempts++;
            try {
                Thread.sleep(1000); // sleep for 1 second.
            } catch (Exception x) {
                fail("Failed due to an exception during Thread.sleep!");
                x.printStackTrace();
            }
        }
    
        if (size > 1) System.err.println("WARN: There are more than 1 " + by.toString() + " 's!");
    
        return driver.findElement(by);
    }
    
  2. You can take it out of the infinite loop. If a page doesn't load something within 10 seconds then i'd say it's an app issue that needs to be rectified. Take it out out of the infinite loop, and using something like waitForElement specified above, or just use a WebDriverWait class.

Furthermore, you shouldn't ever have to scroll to an element. I still have yet to find a reason to do something like this. As long as the element is on the DOM, it should be able to be operated on.

Upvotes: 0

Related Questions