如何使用selenium验证Google搜索结果是否包含特定文本?

时间:2015-11-17 18:04:02

标签: selenium automation

我想验证Google搜索结果是否包含特定文字。 以下是我的代码:

public static void main(String[] args) {

    System.out.println("setting the driver path");
    System.setProperty("webdriver.chrome.driver",   "C:\\Users\\Arushi\\Desktop\\Arushi\\Selenium\\chromedriver_win32\\chromedriver.exe");

    WebDriver driver = new ChromeDriver();
    driver.get("http://google.com");
    driver.manage().window().maximize();
    WebElement textbox = driver.findElement(By.name("q"));
    textbox.sendKeys("stack");

    WebElement button = driver.findElement(By.name("btnG"));
    button.click();

    String bodyText = driver.findElement(By.tagName("body")).getText();
    Assert.assertTrue("Text not found!", bodyText.contains("stackoverflow.com"));

但上面的代码没有给出正确的结果。 getText()方法获取页面的正文文本" google.com"而不是执行搜索后加载的页面。

我想知道两件事:  1.为什么上面的getText()从google.com获取正文  2.在Google搜索结果中搜索特定文本的正确方法是什么。

注意:我也尝试过driver.getPageSource()。contains()方法,但即便没有给出正确的结果。

1 个答案:

答案 0 :(得分:2)

我会通过识别代表DOM上搜索结果的确切元素来攻击它,然后遍历搜索结果的每个实例以验证搜索词的文本。只需在整个页面中搜索某些文本,就会为不准确的结果提供一些机会。

通过查看Google搜索结果页面的DOM,我们可以看到每个搜索结果都位于类.rc的节点中。具有类.r.s的该节点的子节点分别代表结果名称和描述。

我假设您在此示例中要检查搜索字词的搜索结果名称,但您应该能够轻松地根据您的特定需求重构以下代码。

public static void main(String[] args) {
    // First, let's declare our search term
    private String searchTerm = "Selenium";

    // Then, let's start our WebDriver and navigate to google
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.google.com");
    driver.manage().window().maximize();

    // Next, we'll execute the search
    WebElement searchField = driver.findElement(By.name("q"));
    searchField.sendKeys(searchTerm);
    WebElement searchButton = driver.findElement(By.name("btnK"));
    searchButton.click();

    // Now, let's gather our search results
    List<WebElement> results = driver.findElements(By.cssSelector(".r"));

    // Finally, we'll loop over the list to verify each result link contains our term
    for (int i = 0; i < results.size(); i++) {
        Assert.assertTrue(results.get(i).getText().contains(searchTerm), "Search result validation failed at instance [ + i + ].");
    }
}

您可能需要添加任何适当的等待。这也可以进一步调整,以确保在最终通过/失败之前评估每个结果,每个结果的完整输出与术语不匹配,但我将留给您实施。希望这对你来说是一个好的开始。