如何将selenium webdriver中的页面滚动到特定链接

时间:2014-02-02 06:48:05

标签: java selenium-webdriver

我无法滚动到指定的值。在以下链接

http://www.flipkart.com/mobiles/samsung~brand/pr?sid=tyy,4io&otracker=hp_nmenu_sub_electronics_0_Samsung

我需要点击排除缺货,因为我需要滚动网页并点击它。

通过自动化我无法实现这一目标

使用以下代码获取坐标

    Point hoverItem =driver.findElement(By.xpath("//li[@title='Exclude Out of Stock']/a")).getLocation();
    System.out.println("dsds"+hoverItem);
    ((JavascriptExecutor)driver).executeScript("return window.title;");    
    Thread.sleep(6000);
    ((JavascriptExecutor)driver).executeScript("window.scrollBy(0,"+(hoverItem.getY())+");"); 

并使用以下代码向下滚动。

JavascriptExecutor jse = (JavascriptExecutor)driver;
    jse.executeScript("window.scrollBy(143,1459)", "");

然后我用链接点击这个。

driver.findElement(By.xpath("//li[@title='Exclude Out of Stock']/a")).click();

上面的代码无效。

如果我运行代码并手动滚动,则单击指定的值

如何克服这种情况。  代码

   package Examples;

import java.util.concurrent.TimeUnit;

//import org.junit.BeforeClass;
import org.testng.annotations.BeforeClass;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class Flipkart {
    public static WebDriver driver;


    @BeforeClass
    public void beforeClass()
    {
    driver = new FirefoxDriver();
    driver.manage().timeouts().implicitlyWait(30000, TimeUnit.MILLISECONDS);


    }

    @Test

    public void FlipkartTest() throws InterruptedException
    {

        driver.get("https://www.flipkart.com/");
        driver.manage().window().maximize();


        navback();
        System.out.println("22  "+driver.findElement(By.xpath("/html/body/div/div/div[2]/div/div/ul/li/div/div[2]/div/ul/li[2]/a")).getText());
        driver.findElement(By.xpath("/html/body/div/div/div[2]/div/div/ul/li/div/div[2]/div/ul/li[2]/a")).click();


        driver.findElement(By.xpath("//li[@title='Exclude Out of Stock']/a")).click();

    }

    public void navback()
    {
          WebElement we = driver.findElement(By.xpath("//html/body/div/div/div[2]/div/div/ul/li/a/span"));
          Actions action = new Actions(driver);
          action.moveToElement(we).build().perform();
    }



    @AfterClass
    public void tear()
    {
       // driver.quit();
   }
}

2 个答案:

答案 0 :(得分:0)

Selenium Webdriver会自动滚动以定位元素,因此只有findElement() click()才能正常工作,前提是用于定位元素的选择器是正确的。

该元素需要一些时间才能显示,所以我会使用implicit or explicit wait等待它。

 new WebDriverWait(driver,30).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#availability input.facetoption"))).click();

答案 1 :(得分:0)

  1. 尝试使用By.lintext而不是xpath - By.linkText(“Exclude Out of Stock”)
  2. 正如Amith所提到的,点击会自动滚动。
  3. 在尝试使用js之前,请尝试使用Actions方法。 Movetoelement也应该有用。