【问题标题】:Is it possible to get books author name value from href tag with Selenium Java?是否可以使用 Selenium Java 从 href 标签中获取书籍作者姓名值?
【发布时间】:2018-11-13 14:41:55
【问题描述】:
<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");
    }
}

从 cmets 更新

我正在尝试从 amazon.com 上的搜索图书页面获取图书作者姓名,例如,您可以使用搜索查询“Java”amazon.com/s/...访问此链接,我尝试从那里获取作者姓名.

【问题讨论】:

  • 尝试使用 getAttribute("value")
  • 输出为空,不工作。
  • 您是否尝试过使用其他定位器? 例如:xpath: //a[contains(@href,'/Cay-S.-Horstmann/')]' 还要检查是否存在框架。
  • 不走运。更具体地说,我正在尝试从 amazon.com 上的搜索书籍页面获取书籍作者姓名,例如,您可以使用搜索查询“Java”amazon.com/s/… 访问此链接,我试图从那里获取作者姓名。你说的帧是什么意思?
  • 好吧,我可以从网址中提取作者姓名。我没有发现定位器有问题。

标签: java selenium xpath css-selectors webdriverwait


【解决方案1】:

根据您的问题更新以检索 书籍作者姓名,您需要诱导 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());
    

【讨论】:

  • DebanjanB,它真的有效!我知道必须有某种方法来处理这个问题,谢谢))我会接受你的回答,但也许你也可以帮助我进行畅销书检查。我用我处理 isBestSeller 检查的方式更新了主帖,它有效,但是这样的检查花费了太多时间,可能是处理此检查的更好方法......
  • @Wonderio619 很高兴能为您提供帮助!!!您能否针对您的新要求提出一个新问题?由于有多个答案可用,因此更改问题将使其他答案无效,并且可能对未来的读者没有用处。暂时我将您的问题恢复到以前的状态。 StackOverflow 贡献者将很乐意帮助您解决新问题。
  • DebanjanB,我在这里创建了一个关于剩余问题的新帖子,如果你想加入stackoverflow.com/questions/53300695/…
【解决方案2】:

好吧,我可以从 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());
    }
}

【讨论】:

  • Dhamo,我明白你的意思,但这并不是我想要做的。我需要从搜索页面中提取所有作者姓名。通过检查 href 找不到作者姓名。而且您需要访问 href 部分并为每个搜索结果手动输入作者姓名才能使您的代码正常工作,这不是我希望它工作的方式。我用我的代码更新了主帖,我想你会明白我在做什么。
  • 好吧,在那种情况下,要提取页面中的所有作者姓名,您需要将 [to xpath: //span[@class='a-size-small a-color-secondary'并 contains(.,'by')]/../span[2]] 定位器,因为您拥有的定位器不仅可以定位作者姓名,还可以定位页面中的许多元素。
  • Dhamo,谢谢你,明天我会在实习的时候测试你的代码,因为我现在的互联网连接很糟糕。我看到您使用 xpath 来定位作者,它是以某种方式生成的,还是您使用自己的技能编写的?对我来说很奇怪,我无法通过使用 cssselector 从 href 访问简单的 linkText 值,也许我应该开始学习 xpath ...
  • 我写的。学习 xpath 是必须的。万事如意!
  • @Wonderio619 - 请立即检查新代码。它正在工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2021-12-17
  • 2020-06-07
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多