Selenium WebDriver: извлечение строк в результате поиска с использованием цикла - PullRequest
0 голосов
/ 10 мая 2018

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

    String title = null; 
    List <WebElement> links = driver.findElements(By.className("thumbnail"));
    ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());

    for(int i=0; i<1; i++){
        links = driver.findElements(By.className("thumbnail")); // this step is must, because whenever you go to other page all store WebElements in a list will wash out
        links.get(i).click();
   //it opens the search result in a new tab and gains focus on that tab
        WebDriverWait wait = new WebDriverWait(driver, 10);
        By addItem = By.xpath("//*[@id=\"HEADING\"]");

        // get the "Add Item" element
        WebElement element1 = wait.until(ExpectedConditions.presenceOfElementLocated(addItem));
        wait.until(ExpectedConditions.stalenessOf(element1));

        if(!driver.findElements(By.xpath("//*[@id=\"HEADING\"]")).isEmpty()) {
            title = driver.findElement(By.xpath("//*[@id=\"HEADING\"]")).getText();
        }
        else {
             System.out.println("Title is missing");
        }
        System.out.println(title);

        driver.switchTo().window(tabs.get(0)); //Switching to first tab
    }

Код извлекает заголовок на первой странице, а не на странице, по которой он щелкнул. Я также пытаюсь извлечь другие строки, такие как адрес, адрес электронной почты и т. Д., Но я просто проверяю это. Как это исправить? Любая помощь будет оценена, спасибо!

1 Ответ

0 голосов
/ 10 мая 2018

Было несколько вещей, которые я изменил.

  1. Я переместил все ваши локаторы (и некоторые другие объявления) в начало и конец цикла, чтобы они не были повторно объявлены внутри цикла и чтобы на них могли ссылаться вызовы .findElement().
  2. Поскольку вы используете только текущий дескриптор окна, измените тип переменной на String и просто получите текущий дескриптор окна (вместо набора дескрипторов), чтобы вы могли вернуться к главной вкладке в конце петля.
  3. Переместил проверку устаревания сразу после щелчка, так как именно там он вам нужен, и изменил его, чтобы дождаться эскиза, который был только что нажат.
  4. Изменен локатор XPath для использования идентификатора, поскольку это все, на что вы ссылались. Это быстрее, короче и легче для чтения.
  5. Второе ожидание теперь ожидает коллекцию элементов, а затем использует эту коллекцию для проверки на пустоту и получения текста первого в коллекции.

    By addItemLocator = By.id("HEADING");
    By thumbnailsLocator = By.className("thumbnail");
    List<WebElement> links = driver.findElements(thumbnailsLocator);
    String originalTab = driver.getWindowHandle();
    Set<String> tabs = driver.getWindowHandles();
    WebDriverWait wait = new WebDriverWait(driver, 10);
    
    for(int i = 0; i < links.size(); i++)
    {
        links = driver.findElements(thumbnailsLocator); // this step is must, because whenever you go to other page all store WebElements in a list will wash out
        links.get(i).click();
    
        // it opens the search result in a new tab and gains focus on that tab
    
        // switch to the new window
        for(String handle : driver.getWindowHandles()){
            if (!handle.equals(originalTab))
            {
                driver.switchTo().window(handle);
                break;
            }
        }
    
        // get the "Add Item" element
        List<WebElement> addItems = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(addItemLocator));
    
        if(!addItems.isEmpty())
        {
            System.out.println(addItems.get(0).getText());
        }
        else
        {
            System.out.println("Title is missing");
        }
    
        driver.close(); // close current tab
        driver.switchTo().window(originalTab); // switch to original tab
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...