Selenium и Java: как получить весь текст после WebElement - PullRequest
0 голосов
/ 01 июля 2018

Я пишу программу на Java с использованием WebDriver, и у меня возникли небольшие проблемы с получением текста после выбора элемента web.

HTML-код нужной мне части сайта выглядит следующим образом:

Français
  <div id="content">


            <div id="Pagination"></div>
    <div id="mid">
              </div>
  </div>

Коды классов текстового поля для панели поиска и раскрывающейся панели языков

Мой код Java в настоящее время может открывать Chrome с помощью драйвера Chrome и может вводить в строке поиска. Однако я не могу получить текст, полученный в результате записи.

Изображение

На изображении здесь я ввел «avoir» в строку поиска и хочу, чтобы весь текст внутри полей, после которых, похоже, не было идентификаторов или имен, использованных внутри xpath.

Может кто-нибудь помочь мне найти, как получить и сохранить текст из этих полей после выпадающего меню языка?

Заранее спасибо!

Код, который у меня пока есть:

//import statements not shown
    public class WebScrapper  {
    public WebScrapper() {

    }

    public WebDriver driver = new ChromeDriver();

    public void openTestSite() {

        driver.navigate().to(the URL for the website);
    }


    public void enter(String word) {

         WebElement query_editbox = 
         driver.findElement(By.id("query")); 
         query_editbox.sendKeys(word);
         query_editbox.sendKeys(Keys.RETURN);

    }

    public void getText()  {
        //List<WebElement> searchResults = 
        driver.findElements(By.xpath("//div[@id='mid']/div")); 
        // Writer writer = new BufferedWriter(new 
        OutputStreamWriter(new FileOutputStream("status.txt"), 
        "utf-8"));
        //int[] index = {0};

    WebElement result=driver.findElement(By.id("mid"));
    System.out.println(result.getText());
}

public static void main(String[] args) throws IOException  {
    System.setProperty("webdriver.chrome.driver", "chromedriver");        
    System.out.println("Hello");

    WebScrapper webSrcapper = new WebScrapper();
    webSrcapper.openTestSite();
    webSrcapper.enter("avoir");
    webSrcapper.getText();
    System.out.println("Hello");

}

}

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Я указал три подхода для извлечения текста из окна результатов. Пожалуйста, проверьте все подходы и используйте требуемый подход.

  1. Если вы хотите извлечь весь текст, вы можете найти элемент окна результатов, а затем получить текст из этого.

    WebElement result=driver.findElement(By.id("mid"));
    System.out.println(result.getText());
    
  2. Если вы хотите извлечь текст на основе раздела по разделам, то вы можете использовать следующий подход,

    List<WebElement> sectionList=driver.findElements(By.xpath("//div[@id='mid']/div"));
    int i=0;
    for(WebElement element:sectionList){
        System.out.println("Section "+i+":"+element.getText());
        i++;
    }
    
  3. Если вы хотите извлечь текст из определенного раздела, то вы можете сделать это с помощью следующего подхода

        List<WebElement> sectionList=driver.findElements(By.xpath("//div[@id='mid']/div"));
    int i=0;
    //Inorder to get the Section 3 Content
    int section=2;
    for(WebElement element:sectionList){
        if(section==i){
            System.out.println("Section "+i+":"+element.getText());
        }
        i++;
    }
    

Редактировать: Для ответа на вопрос

Я бы предложил использовать некоторое явное ожидание после выполнения некоторого действия, которое привело бы к некоторому отображению элемента. В вашем коде после внесения некоторых изменений я получаю ожидаемый результат.

  1. В методе openTestSite я только что добавил явное ожидание, чтобы гарантировать загрузку страницы после загрузки URL
  2. В методе enter фактически вы получаете предложение автозаполнения после ввода значения запроса. Итак, нам нужно просто выбрать значение из автозаполнения.
  3. В методе getText результат поиска занимает больше времени. Итак, нам нужно добавить явное ожидание, используя любой из динамически загружаемых локаторов элементов.

Код:

Метод openTestSite:

    public void openTestSite() {

    //driver.navigate().to(the URL for the website);
    driver.get("https://wonef.fr/try/");
    driver.manage().window().maximize();
    //Explicit wait is added after the Page load
    WebDriverWait wait=new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.titleContains("WoNeF"));
}

введите метод:

public void enter(String word) {

    WebElement query_editbox =
            driver.findElement(By.id("query"));
    query_editbox.sendKeys(word);
    //AutoComplete is happening even after sending the Enter Key.
    // So, Value needs to be selected from the autocomplete
    WebDriverWait wait=new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='autocomplete']/div")));
    List<WebElement> matchedList=driver.findElements(By.xpath("//div[@class='autocomplete']/div"));

    System.out.println(matchedList.size());
    for(WebElement element : matchedList){
        if(element.getText().equalsIgnoreCase(word)){
            element.click();
        }
    }
    //query_editbox.sendKeys(Keys.RETURN);
}

Метод getText :

public void getText()  {
    WebDriverWait wait=new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='mid']/div")));
    WebElement result=driver.findElement(By.id("mid"));
    System.out.println(result.getText());
}

Я протестировал с вышеупомянутым измененным кодом, и он работает нормально.

0 голосов
/ 01 июля 2018

Чтобы проверить релевантные результаты для вашего запроса, общей стратегией будет загрузка списка результатов поиска:

List<WebElement> searchResults = driver.findElements(By.xpath("//div[@id='mid']/div")); 

Теперь вы можете использовать поток для перебора списка и извлечения нужного текста, получая текст из дочерних элементов каждого результата:

int[] index = {0};
searchResults.stream().forEach(result -> {
    System.out.println("Printing query result of index: " + index[0]);
    result.findElements(By.xpath(".//*")).stream().forEach(webElement -> {
        try {
            System.out.println(webElement.getText());
        } catch (Exception e) {
            // Do nothing
        }
    });
    index[0]++;
});

И вы получите вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...