是否可以使用Selenium Java从href标记获取图书作者姓名值?

是否可以使用Selenium Java从href标记获取图书作者姓名值?,java,selenium,xpath,css-selectors,webdriverwait,Java,Selenium,Xpath,Css Selectors,Webdriverwait,但它只输出一个空字符串 link.findElement(By.cssSelector("a.a-link-normal.a-text-normal")).getText()); 公共类AmazonSearchResultsPage{ 公共AmazonSearchResultsPage(网络驱动程序){ PageFactory.initElements(驱动程序,this); this.driver=driver; } 公共网络驱动程序; @FindBy(css=“#s-results-lis

但它只输出一个空字符串

link.findElement(By.cssSelector("a.a-link-normal.a-text-normal")).getText());
公共类AmazonSearchResultsPage{
公共AmazonSearchResultsPage(网络驱动程序){
PageFactory.initElements(驱动程序,this);
this.driver=driver;
}
公共网络驱动程序;
@FindBy(css=“#s-results-list-atf”)
公共网站元素搜索结果;
public void getBooksInfo(){
列表链接=searchResults.findElements(按.tagName(“li”));
如果(links.size()>0){
字符串标题,作者,价格,评级,畅销书;
对于(int i=0;i
根据评论更新


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

嗯,从URL我可以提取信息

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");
    }
}
更新问题的代码:

[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
publicstaticvoidtestmf(){
网络驱动程序;
System.setProperty(“webdriver.gecko.driver”,“/src/drivers/geckodriver64bit.exe”);
驱动程序=新的FirefoxDriver();
司机,快(
"https://www.amazon.com/s/ref=nb_sb_noss?url=search-别名%3Daps&field关键字=Java&rh=i%3Aaps%2Ck%3AJava”);
List searchResults=driver.findElements(按
.xpath(“//div[@class='s-item-container'][1]/div/div/div[@class='a-fixed-left-grid-col a-col-right']”);
System.out.println(searchResults.size());
试一试{
if(searchResults.size()>0){
字符串标题,author=null;
int i=0;
for(WebElement el:searchResults){
((JavascriptExecutor)driver).executeScript(“参数[0].ScrollingToView();”,el);
i++;
title=el.findElement(通过.cssSelector(“h2.a-size-medium.s-inline.s-access-title.a-text-normal”))
.getText();
System.out.println(“标题:+i+”-“+Title”);
if(el.findElements(由.cssSelector(“div.a-row.a-spating-small>div:n个子项(2)”)).size()>0){
author=el.findElement(由.cssSelector(“div.a-row.a-spating-small>div:n个子项(2)”).getText();
}
System.out.println(“Author:+i+”-“+(Author.isEmpty()?“Author Not Found”:Author));
}
}否则
System.out.println(“您的搜索没有结果”);
}捕获(例外e){
System.out.println(e.getLocalizedMessage());
}
}

根据您的问题更新,要检索图书作者姓名,您需要诱导WebDriverWait以使所需元素可见,您可以使用以下任一解决方案:

  • css选择器

    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());
        }
    }
    

尝试使用getAttribute(“值”)输出为空,不起作用。是否尝试使用其他定位器?例如:xpath://a[contains(@href,“/Cay-S.-Horstmann/”)]”还要检查是否存在帧。运气不好。更具体地说,我正在尝试从amazon.com上的搜索图书页面获取图书作者姓名,例如,您可以使用搜索查询“Java”访问此链接,我尝试从那里获取作者姓名。你说的框架是什么意思?我可以从url中提取作者的名字。我不认为定位器有问题。达莫,我明白你的意思,但这并不是我想要做的。我需要从搜索页面中提取所有作者的姓名。通过检查href无法找到作者姓名。您需要访问href部分并手动键入每个搜索结果的作者姓名,以便代码正常工作,这不是我希望的工作方式。我用我的代码更新了主要帖子,我想你会明白我在做什么。那么,在这种情况下,要提取页面中的所有作者姓名,你需要更改为[xpath://span[@a-size-small a-color-secondary],并包含(,'by')]/../span[2]]你拥有的定位器不仅定位作者姓名,而且定位页面中的许多元素。达莫,谢谢你,我明天将在实习时测试你的代码,因为我现在的网络连接非常糟糕。我看到您使用xpath查找作者,它是以某种方式生成的,还是您使用自己的技能编写的?奇怪的是,我无法使用cssselector从href访问简单的linkText值,可能是我应该开始学习xpath了……这是我写的。学习xpath是必须的。祝你一切顺利@Wonderio619-请现在检查新代码。德班詹布,真的很管用!我知道一定有办法解决这个问题,谢谢你)我会接受你的回答,但也许你也能帮我查一下畅销书。我用我处理isBestSeller检查的方式更新了主帖子,它是有效的,但是像这样的检查花费了太多的时间,可能是处理此检查的更好方式…@Wonderio619很高兴能够帮助你!!!你能用你的新要求提出一个新问题吗?由于有多个答案可用,因此更改问题将使其他答案无效,对未来的读者可能没有用处。现在我把你的问题恢复到以前的状态。StackOverflow贡献者将很乐意为您解答新问题。DebanjanB,我在这里创建了一个关于剩余问题的新线程,如果您愿意,请加入
[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());
    }
}
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());
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());