Можно ли получить значение имени автора книги из тега href с помощью Selenium Java?
<a class="a-link-normal a-text-normal"
href="/Cay-S.-Horstmann/e/B000AQ1QDY/ref=sr_ntt_srch_lnk_1?qid=1542117551&sr=8-1-spons">
Cay S. Horstmann
</a>
Что я имею в виду, возможно ли получить текст Cay S. Horstmann сверху тега?
Теперь я пытаюсь получить это так:
link.findElement(By.cssSelector("a.a-link-normal.a-text-normal")).getText());
Но он просто выводит пустую строку...
public class AmazonSearchResultsPage {
public AmazonSearchResultsPage(WebDriver driver) {
PageFactory.initElements(driver, this);
this.driver = driver;
}
public WebDriver driver;
@FindBy(css = "#s-results-list-atf")
public WebElement searchResults;
public void getBooksInfo () {
List<WebElement> links = searchResults.findElements(By.tagName("li"));
if (links.size() > 0) {
String title, author, price, rating, isBestSeller;
for (int i = 0; i < links.size(); i++) {
title = links.get(i).findElement(By.cssSelector("h2.a-size-medium.s-inline.s-access-title.a-text-normal")).getText();
author = links.get(i).findElement(By.cssSelector("a.a-link-normal.a-text-normal")).getText());
}
}
else System.out.println("Your search has no results");
}
}
Обновление из комментариев
Я пытаюсь получить имя автора книги на странице искомых книг на amazon.com, например, вы можете перейти по этой ссылке с помощью поискового запроса "Java "amazon.com/s/…, я пытался получить имя автора оттуда.
2 ответа
Решение
В соответствии с обновлением вашего вопроса, чтобы получить имя автора книги, вам нужно заставить WebDriverWait отображать нужные элементы, и вы можете использовать любое из следующих решений:
cssSelector
:List<WebElement> author_name_elements = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("ul#s-results-list-atf span.a-size-small.a-color-secondary>a.a-link-normal.a-text-normal"))); for (WebElement author_name:author_name_elements){ System.out.println(author_name.getText());
XPATH
:List<WebElement> author_name_elements = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//ul[@id='s-results-list-atf']//span[contains(.,'by')]//following::span[1]/a[@class='a-link-normal a-text-normal']"))); for (WebElement author_name:author_name_elements){ System.out.println(author_name.getText());
Ну, из URL я могу извлечь информацию.
@Test
public static void testMF(){
WebDriver driver;
System.setProperty("webdriver.gecko.driver","./src/drivers/geckodriver64bit.exe");
driver=new FirefoxDriver();
driver.get("https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=Java&rh=i%3Aaps%2Ck%3AJava");
List<WebElement> authorNames=driver.findElements(By.xpath("//a[contains(@href,'/Cay-S.-Horstmann/')]"));
for (WebElement author:authorNames){
System.out.println(author.getText());
}
}
и вот консольный вывод с именем автора:
[RemoteTestNG] detected TestNG version 6.14.2
1542125453774 mozrunner::runner INFO Running command: "C:\\Program Files\\Mozilla Firefox\\firefox.exe" "-marionette" "-foreground" "-no-remote" "-profile" "C:\\Users\\Dhamo\\AppData\\Local\\Temp\\rust_mozprofile.ZTVooPdHTxOZ"
1542125455373 Marionette INFO Listening on port 63531
1542125455395 Marionette WARN TLS certificate errors will be ignored for this session
Nov 13, 2018 10:10:55 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
Cay S. Horstmann
Cay S. Horstmann
Код для обновленного вопроса:
public static void testMF() {
WebDriver driver;
System.setProperty("webdriver.gecko.driver", "./src/drivers/geckodriver64bit.exe");
driver = new FirefoxDriver();
driver.get(
"https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=Java&rh=i%3Aaps%2Ck%3AJava");
List<WebElement> searchResults = driver.findElements(By
.xpath("//div[@class='s-item-container'][1]/div/div/div[@class='a-fixed-left-grid-col a-col-right']"));
System.out.println(searchResults.size());
try {
if (searchResults.size() > 0) {
String title, author = null;
int i = 0;
for (WebElement el : searchResults) {
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", el);
i++;
title = el.findElement(By.cssSelector("h2.a-size-medium.s-inline.s-access-title.a-text-normal"))
.getText();
System.out.println("Title:" + i + "-" + title);
if(el.findElements(By.cssSelector("div.a-row.a-spacing-small > div:nth-child(2)")).size()>0){
author = el.findElement(By.cssSelector("div.a-row.a-spacing-small > div:nth-child(2)")).getText();
}
System.out.println("Author:" + i + "-" + (author.isEmpty()?"Author Not Found":author));
}
} else
System.out.println("Your search has no results");
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
}
}