Откройте и прочитайте текст электронного письма (из Gmail) с определенным заголовком с помощью Selenium /Katalon (Java)

#java #selenium #email #gmail #katalon-studio

#java #selenium #Адрес электронной почты #gmail #katalon-studio

Вопрос:

Я хотел бы:

  • откройте Gmail
 driver = new ChromeDriver();
driver.get("https://mail.google.com/mail/#inbox");
  
  • найдите заголовок
 driver.findElement(By.xpath("//input[@name='q']")).click();
driver.findElement(By.xpath("//input[@name='q']")).clear();
driver.findElement(By.xpath("//input[@name='q']")).sendKeys("Title");
driver.findElement(By.cssSelector("button.gb_2e.gb_df > svg")).click();
  
  • откройте и сохраните текст всех электронных писем с таким заголовком (возможно, расположенных на разных страницах)

Как я могу это сделать?

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

1. Вы уже сделали это? В чем именно проблема?

2. Да, я пытался это реализовать, но у меня проблема с условием внутри цикла while, потому что он не может найти кнопку для смены страницы. Я попробовал cssSelector, предложенный C. Peck, но у меня возникла эта ошибка: «Исключение в потоке «AWT-EventQueue-0″ org.openqa.selenium. Исключение ElementNotVisibleException: элемент недоступен для взаимодействия». Как я могу это исправить?

Ответ №1:

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

Для меня следующий CSS-селектор находит все элементы электронной почты на странице:

 WebElement[] listOfEmailElements = driver.findElements(By.cssSelector('tbody > tr.zA'));
  

Если, например, у вас есть 50 результатов на этой странице, он вернет массив, содержащий эти 50 WebElements.

Теперь нам нужно просмотреть электронные письма, щелкнув по каждому из них, затем нажать на … щелкните значок и загрузите электронное письмо, а затем вернитесь на главную страницу внутри цикла for.

 for (WebElement element: listOfEmailElements) {
    element[i].click();

    //The following is the only way I could find to uniquely identify the '...' icon

    driver.findElement(By.cssSelector('div.T-I.J-J5-Ji.T-I-Js-Gs.aap.T-I-awG.T-I-ax7.L3').click();


    //Couldn't find a way to uniquely identify the "Download" button but the following selector gets
    //an array of options from the list you just opened above and download is at an index of 16

    driver.findElements(By.cssSelector('div.cj'))[16].click();

    //simply use the browser's back button to navigate back to the main list

    driver.navigate().back();
}
  

Хорошо, теперь нам просто нужно обработать разбивку на страницы.

Мне кажется, что значок курсора, который переходит на следующую страницу, когда он включен, однозначно идентифицируется

 driver.findElement(By.cssSelector('div.T-I.J-J5-Ji.amD.T-I-awG.T-I-ax7.T-I-Js-Gs.L3'))
  

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

 while (driver.findElements(By.cssSelector('div.T-I.J-J5-Ji.amD.T-I-awG.T-I-ax7.T-I-Js-Gs.L3')).size() == 1) {
        for (WebElement element: listOfEmailElements) {
            element[i].click();

            //The following is the only way I could find to uniquely identify the '...' icon

           driver.findElement(By.cssSelector('div.T-I.J-J5-Ji.T-I-Js-Gs.aap.T-I-awG.T-I-ax7.L3').click();


           //Couldn't find a way to uniquely identify the "Download" button but the following selector gets
           //an array of options from the list you just opened above and download is at an index of 16

           driver.findElements(By.cssSelector('div.cj'))[16].click();

           //simply use the browser's back button to navigate back to the main list

           driver.navigate().back();
    }
}
  

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

1. Большое вам спасибо за ответ. Я использовал аналогичное решение, но у меня проблема с условием внутри цикла while, потому что он не может найти кнопку для изменения страницы, указанной этим cssSelector. Он возвращает эту ошибку: «Исключение в потоке «AWT-EventQueue-0″ org.openqa.selenium. Исключение ElementNotVisibleException: элемент недоступен для взаимодействия». Как я могу это исправить?

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

3. Используя этот тестовый код: wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(«div.T-I.J-J5-Ji.amD.T-I-awG.T-I-ax7.T-I-Js-Gs.L3»))) ; driver.findElement(By.cssSelector(«div.T-I.J-J5-Ji.amD.T-I-awG.T-I-ax7.T-I-Js-Gs.L3»)).click(); У меня есть: imgur.com/a/O20rsJI пока, без ожидания: imgur.com/bYgzGTg