Selenium和Java:如何获取WebElement之后的所有文本

时间:2018-07-01 04:38:55

标签: java selenium selenium-webdriver webdriver

我正在使用WebDriver用Java编写程序,在选择webElement之后获取文本有些麻烦。

我想要的网站部分的HTML代码如下:

                                  法兰西                
  <div id="content">


            <div id="Pagination"></div>
    <div id="mid">
              </div>
  </div>

用于语言的搜索栏和下拉栏的文本框类代码

我的Java代码当前能够使用chrome驱动程序打开chrome,并且能够在搜索栏中键入内容。但是,我无法获得该条目产生的文本。

Image

在这里的图像中,我在搜索栏中输入了“ avoir”,我希望框内的所有文本在xpath中似乎都没有要使用的ID或名称。

在下拉语言菜单之后,有人可以帮助我找到如何从这些字段中获取和保存文本吗?

提前谢谢!

我到目前为止的代码:

//import statements not shown
    public class WebScrapper  {
    public WebScrapper() {

    }

    public WebDriver driver = new ChromeDriver();

    public void openTestSite() {

        driver.navigate().to(the URL for the website);
    }


    public void enter(String word) {

         WebElement query_editbox = 
         driver.findElement(By.id("query")); 
         query_editbox.sendKeys(word);
         query_editbox.sendKeys(Keys.RETURN);

    }

    public void getText()  {
        //List<WebElement> searchResults = 
        driver.findElements(By.xpath("//div[@id='mid']/div")); 
        // Writer writer = new BufferedWriter(new 
        OutputStreamWriter(new FileOutputStream("status.txt"), 
        "utf-8"));
        //int[] index = {0};

    WebElement result=driver.findElement(By.id("mid"));
    System.out.println(result.getText());
}

public static void main(String[] args) throws IOException  {
    System.setProperty("webdriver.chrome.driver", "chromedriver");        
    System.out.println("Hello");

    WebScrapper webSrcapper = new WebScrapper();
    webSrcapper.openTestSite();
    webSrcapper.enter("avoir");
    webSrcapper.getText();
    System.out.println("Hello");

}

}

2 个答案:

答案 0 :(得分:1)

为了检查与查询相关的结果,常见的策略是加载搜索结果列表:

List<WebElement> searchResults = driver.findElements(By.xpath("//div[@id='mid']/div")); 

现在,通过从每个结果的子元素中获取文本,您可以使用流来遍历列表并提取相关文本:

int[] index = {0};
searchResults.stream().forEach(result -> {
    System.out.println("Printing query result of index: " + index[0]);
    result.findElements(By.xpath(".//*")).stream().forEach(webElement -> {
        try {
            System.out.println(webElement.getText());
        } catch (Exception e) {
            // Do nothing
        }
    });
    index[0]++;
});

您将得到输出:

enter image description here

答案 1 :(得分:1)

我指定了三种从结果框中提取文本的方法。请检查所有方法并使用所需的方法。

  1. 如果要提取所有文本,则可以找到结果框的元素,然后从中获取文本。

    WebElement result=driver.findElement(By.id("mid"));
    System.out.println(result.getText());
    
  2. 如果您要按节提取文本,则可以采用以下方法,

    List<WebElement> sectionList=driver.findElements(By.xpath("//div[@id='mid']/div"));
    int i=0;
    for(WebElement element:sectionList){
        System.out.println("Section "+i+":"+element.getText());
        i++;
    }
    
  3. 如果要从特定部分提取文本,则可以采用以下方法

        List<WebElement> sectionList=driver.findElements(By.xpath("//div[@id='mid']/div"));
    int i=0;
    //Inorder to get the Section 3 Content
    int section=2;
    for(WebElement element:sectionList){
        if(section==i){
            System.out.println("Section "+i+":"+element.getText());
        }
        i++;
    }
    

修改:解决后续问题

我建议在执行某些操作后使用一些显式等待,从而导致某些元素呈现。在您的代码中,进行了一些修改后,我得到了预期的结果。

  1. openTestSite方法中,我刚刚添加了显式等待,以确保在加载URL之后加载页面
  2. enter方法中,实际上您是在输入查询值后得到自动完成建议的。因此,我们只需从自动完成中选择该值即可。
  3. getText方法中,搜索结果会花费更多时间。因此,我们需要使用任何一个动态加载元素定位器添加一些显式等待。

代码:

openTestSite方法:

    public void openTestSite() {

    //driver.navigate().to(the URL for the website);
    driver.get("https://wonef.fr/try/");
    driver.manage().window().maximize();
    //Explicit wait is added after the Page load
    WebDriverWait wait=new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.titleContains("WoNeF"));
}

输入方法:

public void enter(String word) {

    WebElement query_editbox =
            driver.findElement(By.id("query"));
    query_editbox.sendKeys(word);
    //AutoComplete is happening even after sending the Enter Key.
    // So, Value needs to be selected from the autocomplete
    WebDriverWait wait=new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='autocomplete']/div")));
    List<WebElement> matchedList=driver.findElements(By.xpath("//div[@class='autocomplete']/div"));

    System.out.println(matchedList.size());
    for(WebElement element : matchedList){
        if(element.getText().equalsIgnoreCase(word)){
            element.click();
        }
    }
    //query_editbox.sendKeys(Keys.RETURN);
}

getText方法

public void getText()  {
    WebDriverWait wait=new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='mid']/div")));
    WebElement result=driver.findElement(By.id("mid"));
    System.out.println(result.getText());
}

我已经使用上述修改后的代码进行了测试,并且工作正常。