31

我想在<h5>. 我正在 craigslist 中尝试这个。任何帮助将不胜感激

这是网址: http ://auburn.craigslist.org/

 <html class="">
<head>
<body class="homepage w1024 list">
    <script type="text/javascript">
    <article id="pagecontainer">
            <section class="body">
        <table id="container" cellspacing="0" cellpadding="0" 
    <tbody>
           <tr>
    <td id="leftbar">
    <td id="center">
    <td id="rightbar">
        <ul class="menu collapsible">
            <li class="expand s">
            <li class="s">
            <li class="s">
                <h5 class="ban hot">us states</h5>
                <ul class="acitem" style="display: none;">
            </li>
        <li class="s">
        <li class="s">
4

3 回答 3

76

在您的情况下,仅使用类名是不够的。

  • By.cssSelector(".ban")有 15 个匹配节点
  • By.cssSelector(".hot")有 11 个匹配节点
  • By.cssSelector(".ban.hot")有 5 个匹配节点

因此,您需要更多限制来缩小范围。下面的选项 1 和 2可用于 css 选择器,1 可能是最适合您需求的选项。

选项 1:使用列表项的索引(CssSelector 或 XPath)

限制

  • 如果站点结构发生变化,则不够稳定

例子:

driver.FindElement(By.CssSelector("#rightbar > .menu > li:nth-of-type(3) > h5"));
driver.FindElement(By.XPath("//*[@id='rightbar']/ul/li[3]/h5"));

选项 2:使用 Selenium's FindElements,然后索引它们。(CssSelector 或 XPath)

限制

  • 如果站点结构发生变化,则不够稳定
  • 不是原生选择器的方式

例子:

// note that By.CssSelector(".ban.hot") and //*[contains(@class, 'ban hot')] are different, but doesn't matter in your case
IList<IWebElement> hotBanners = driver.FindElements(By.CssSelector(".ban.hot"));
IWebElement banUsStates = hotBanners[3];

选项 3:使用文本(仅限 XPath)

限制

  • 不适用于多语言网站
  • 仅适用于 XPath,不适用于 Selenium 的 CssSelector

例子:

driver.FindElement(By.XPath("//h5[contains(@class, 'ban hot') and text() = 'us states']"));

选项 4:索引分组选择器(仅限 XPath)

限制

  • 如果站点结构发生变化,则不够稳定
  • 仅适用于 XPath,不适用于 CssSelector

例子:

driver.FindElement(By.XPath("(//h5[contains(@class, 'ban hot')])[3]"));

选项 5:通过 href 找到隐藏的列表项链接,然后遍历回 h5(仅限 XPath)

限制

  • 仅适用于 XPath,不适用于 CssSelector
  • 性能低下
  • 棘手的 XPath

例子:

driver.FindElement(By.XPath(".//li[.//ul/li/a[contains(@href, 'geo.craigslist.org/iso/us/al')]]/h5"));
于 2013-08-17T23:54:32.517 回答
0

By.cssSelector(".ban")或者By.cssSelector(".hot")或者By.cssSelector(".ban.hot")应该全部选择它,除非有另一个元素具有这些类。

在 CSS 中,.name意味着找到一个具有name. .foo.bar.baz意味着找到具有所有这些类的元素(在同一个元素中)。

但是,这些选择器中的每一个都只会选择页面上与其匹配的第一个元素。如果您需要更具体的内容,请发布具有这些类的其他元素的 HTML。

于 2013-08-17T12:06:30.907 回答
0

您可以像级联样式表一样描述您的 css 选择:

protected override void When()
{
   SUT.Browser.FindElements(By.CssSelector("#carousel > a.tiny.button"))
}
于 2014-07-01T23:00:04.300 回答