2016-03-02 3 views
1

Как мне найти что-то в Google, нажмите ссылку, затем вернитесь к поиску и нажмите следующую ссылку (без повторения уже отобранных ссылок) и после ссылок, которые страница завершена, перейдите на страницу 2 и повторите те же шаги подряд?Перемещение между страницами Google Поиск с помощью selenium - Java

До сих пор я могу перейти к первой ссылке, перейти на страницу и вернуться в список только что просмотренных ссылок.

package Search; 

import java.util.List; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.ie.InternetExplorerDriver; 
import org.openqa.selenium.remote.DesiredCapabilities; 
import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class GoogleSearch { 

    public static void main(String[] args) throws InterruptedException { 
     // TODO Auto-generated method stub 


      System.setProperty("webdriver.ie.driver", "C:/Users/paulo.roberto/Documents/eclipse/Selenium/IEDriverServer.exe"); 
       DesiredCapabilities caps = DesiredCapabilities.internetExplorer(); 
       caps.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true); 
       WebDriver driver = new InternetExplorerDriver(caps);   
       driver.manage().window().maximize(); 
       driver.manage().deleteAllCookies(); 

      driver.get("https://www.google.com.br"); 

      driver.findElement(By.name("q")).sendKeys("test"); 
      driver.findElement(By.name("btnG")).click(); 

      WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("resultStats"))); 


      // find the number of pages 
      int size = driver.findElements(By.cssSelector("[valign='top'] > td")).size(); 
      for(int j = 1 ; j < size ; j++) { 
       if (j > 1) {// we don't need to navigate to the first page 
        driver.findElement(By.cssSelector("[aria-label='Page " + j + "']")).click(); // navigate to page number j 
       } 

       String pagesearch = driver.getCurrentUrl(); 

       List<WebElement> findElements = driver.findElements(By.xpath("//*[@id='rso']//h3/a")); 
       System.out.println(findElements.size()); 

       for(int i=0;i<findElements.size();i++){ 
        findElements= driver.findElements(By.xpath("//*[@id='rso']//h3/a"));     
        findElements.get(i).click(); 

        driver.navigate().to(pagesearch); 
        // or driver.navigate().back(); 
       } 
      } 



    } 

} 

сообщение на консоль:

Started InternetExplorerDriver server (32-bit) 
2.48.0.0 
Listening on port 37101 
10 
10 
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 0 
    at java.util.ArrayList.rangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at Search.GoogleSearch.main(GoogleSearch.java:48) 
+1

Почему вы хотите повторно загрузить результаты поиска Google несколько раз? Загрузите его только один раз, у вас есть результат, который вы сможете продолжить. Я бы использовал JSoup для анализа страниц вместо Selenium. – tak3shi

+0

@ tak3shi На самом деле, я изучаю селен и поэтому создаю код в качестве примера. Желание не использует утилиту jsoup, просто хочу, чтобы иметь возможность перемещаться по URL-адресам, а затем перейти к следующим страницам поиска и нажать на следующую ссылку, вот и все. –

+1

ОК, это прекрасно, но google обнаружит автоматизированный доступ, и в какой-то момент вы получите страницу captcha вместо результатов поиска. – tak3shi

ответ

1

Вы можете использовать вложенные циклы. Один для перемещения между страницами результатов и один щелчок по результатам

// find the number of pages 
int size = driver.findElements(By.cssSelector("[valign='top'] > td")).size(); 
for(int j = 1 ; j < size ; j++) { 
    if (j > 1) {// we don't need to navigate to the first page 
     driver.findElement(By.cssSelector("[aria-label='Page " + j + "']")).click(); // navigate to page number j 
    } 

    String pagesearch = driver.getCurrentUrl(); 

    List<WebElement> findElements = driver.findElements(By.xpath("//*[@id='rso']//h3/a")); 
    System.out.println(findElements.size()); 

    for(int i=0;i<findElements.size();i++){ 
     findElements= driver.findElements(By.xpath("//*[@id='rso']//h3/a"));     
     findElements.get(i).click(); 

     driver.navigate().to(pagesearch); 
     // or driver.navigate().back(); 
    } 
} 
+0

Он правильно перемещался в некоторой степени, но на третьей странице стоял в одной из доступных ссылок и не возвращался в список поиска, вы говорите мне, как его решить, чтобы он продолжался через страницы правильно? Переменный pageearch {String pagesearch = driver.getCurrentUrl();} записывает URL-адрес поиска, но я думаю, что она записывает только начальный URL-адрес поиска, а не следующую страницу, не так ли? –

+0

Показывает ошибку при выполнении, а не на острове, просто попадает в доступную ссылку. –

+0

@PauloSilva У вас есть опции, захват url во внешнем цикле (добавлен к моему ответу) или использование 'driver.navigate(). Back();' вместо 'driver.navigate(). To (pagesearch);' – Guy

Смежные вопросы