#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