在谷歌搜索结果中找到搜索文本,在Chrome浏览器中使用selenium webdriver



我是selenium webdriver的新手,遇到了一个问题

我用谷歌搜索了一些东西,结果出现了。现在我想看看前5个结果是否包含搜索的文本。

为例:

我想搜索文本"selenium webdriver"。现在我想检查前5个结果是否包含文本"selenium webdriver"。

这是我的部分:

chromeDriver.Navigate().GoToUrl("http://www.google.co.uk");
IWebElement searchText = chromeDriver.FindElement(By.XPath(".//html/body/div[3]/div/div/div[2]/div[2]/div/form/fieldset[2]/div/div/div/table/tbody/tr/td[2]/div/input"));
searchText.SendKeys("selenium webdriver");
IWebElement searchButton = chromeDriver.FindElement(By.Name("btnG"));
searchButton.Click() ;
IWebElement resultingText = chromeDriver.FindElement(By.LinkText("selenium webdriver"));

这一行抛出了一个异常:

// IWebElement resultingText = chromeDriver.FindElement(By.LinkText("selenium webdriver"));
在这个问题上有谁能帮我吗?

你得到的异常,因为一个LinkText定位器将找到一个精确匹配的链接文本,所以它正在寻找一个链接,只包含文本"selenium webdriver"。如果您查看Google搜索的结果,会发现没有完全匹配,因此会得到异常。

此代码将打印出搜索结果第一页中包含的每个链接。从这里开始,你可以修改它来检查前五个,看看它是否包含符合你的标准的文本:

IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("http://google.com");
IWebElement element = driver.FindElement(By.Id("gbqfq"));
element.SendKeys("selenium webdriver");
// Get the search results panel that contains the link for each result.
IWebElement resultsPanel = driver.FindElement(By.Id("search"));
// Get all the links only contained within the search result panel.
ReadOnlyCollection<IWebElement> searchResults = resultsPanel.FindElements(By.XPath(".//a"));
// Print the text for every link in the search results.
foreach (IWebElement result in searchResults)
{
    Console.WriteLine(result.Text);
}
  1. 你使用了糟糕的xpath。试试//input[@id='gbqfq']
  2. 当你通过文本搜索时,它是注册表敏感的
  3. 对于有5个结果的情况,您可以使用以下代码(我不熟悉c#,所以这里是python代码,您应该理解它):

    first_five = driver.find_elements_by_xpath(".//*[@id='rso']//div//h3/a")[:5]     
    #returns the list of first five result links
    for result in first_five:
        assert "selenium webriver" in result.text.lower(), "Result does not contain 'selenium webdriver'" 
        # lower - to get rid off registry troubles
    

最好使用CSS选择器,或者如果您愿意只使用XPath。请选择"fire path"。它生成简短而精确的Xpath,并将其放入代码中。避免使用如此冗长的Xpath。

我使用vb.netselenium解决了这个问题。这对我很有效。我希望这对参考有帮助。

Imports OpenQA.Selenium'
Module SearchResults
Sub Main()
    Try
        Dim Browser As Chrome.ChromeDriver = New Chrome.ChromeDriver("C:SeleniumLiveDriverFiles")
        Browser.Navigate.GoToUrl("https://www.google.co.in")
        For i = 0 To 4
            If Browser.FindElement(By.Id("lst-ib")) Is Nothing Then
                Threading.Thread.Sleep(1000)
            End If
        Next
        If Browser.FindElement(By.Id("lst-ib")) IsNot Nothing Then
            Browser.FindElement(By.Id("lst-ib")).SendKeys("Sumit Shitole" & Keys.Enter)
        End If
        Threading.Thread.Sleep(3000)
        For pageNumber As Integer = 1 To 8 Step 1
            Console.WriteLine("......Result from page " & pageNumber & "..........")
            Dim results As New List(Of IWebElement)(Browser.FindElements(By.CssSelector(".r>a")))
            For Each result As IWebElement In results
                Console.WriteLine(result.Text)
            Next
            Browser.FindElement(By.Id("pnnext")).Click()
            Threading.Thread.Sleep(3000)
        Next
        Console.ReadLine()
        Browser.Close()
    Catch ex As Exception
        Console.WriteLine(ex.ToString)
    End Try
    Console.ReadKey()
End Sub
End Module

最新更新