Можно ли получить значение имени автора книги из тега href с помощью Selenium Java? - PullRequest
0 голосов
/ 13 ноября 2018
<a class="a-link-normal a-text-normal" 
   href="/Cay-S.-Horstmann/e/B000AQ1QDY/ref=sr_ntt_srch_lnk_1?qid=1542117551&amp;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 ]

0 голосов
/ 14 ноября 2018

В соответствии с обновлением вашего вопроса, чтобы получить имя автора книги , вам нужно заставить 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());
    
0 голосов
/ 13 ноября 2018

Ну, из 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());
    }
}
...