Как найти автоматическое предложение в поиске Google с помощью Xpath

#java #selenium #webdriver

#java #selenium #webdriver

Вопрос:

С помощью Selenium webdriver я пытаюсь выполнить поиск ‘Selenium’ в окне поиска Google, которое предоставляет автоматические предложения по нескольким текстам. Затем я пытаюсь щелкнуть один конкретный текст из списка автоматических предложений. Похоже, мой Xpath не работает.

Ниже приведен код, который я написал:

 package com.initial.selenium;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class GoogleSearch {

    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver",
            "C:\Users\Shahid\eclipse-
    workspace\InitialSeleniumProject\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("https://www.google.com");
        driver.findElement(By.xpath("//*[@name='q']")).sendKeys("selenium");
        List < WebElement >

            mylist=driver.findElements(By.xpath("//ul[@role='listbox']//li/descendant::div[@class='sbl1']/span"));
        System.out.println(mylist.size());
        for (int i = 0; i < mylist.size(); i  ) {

            System.out.println(mylist.get(i).getText());
            if (mylist.get(i).getText().contains("Selenium Benefits")) {
                mylist.get(i).click();
                break;
            }

        }

    }
  

Комментарии:

1. что значит не работает ?

2. Скрипт выдает 0 результатов

3. Вы пробовали webdriverwait?

4. @ShahidIslam используйте этот xpath — //ul[@class=’erkvQe’]//li и извлеките из него текст. он вернет текст span.

5. @Dhru ‘Soni: спасибо. Это сделало свое дело. Я все еще не понимаю, почему мой xpath не работал. Если вы можете, пожалуйста, указать на любую проблему с моим xpath, я был бы очень признателен.

Ответ №1:

Попробуйте это:

 List<WebElement> options = new WebDriverWait(driver, 10).until(ExpectedConditions.numberOfElementsToBeMoreThan(By.xpath("//ul[@role='listbox']//li/descendant::span"), 0));

    System.out.println("no. of suggestions:" options.size());
    
    for(int i=0;i<options.size();i  ) {
        
        System.out.println(options.get(i).getText());
    }
  

Ответ №2:

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

Изображение, показывающее, что целевой ul не содержит дочерних элементов

Итак, в этом случае вы собираетесь изменить свою цель. Вместо того, чтобы делать:

 ul[@role='listbox']
  

Выполните

 li[@role='presentation']
  

И это приведет к

 //li[@role='presentation']/descendant::div[@class='sbl1']/span
  

Который возвращает диапазон, который вы пытаетесь получить.

Комментарии:

1. С этим xpath скрипт выдает 1

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