Подтвердить что ты не робот

Нужно найти элемент в селене css

Я хочу найти элемент этой ссылки "us states" в <h5>. Я пытаюсь это сделать в Craigslist. Любая помощь будет высоко оценена

Вот URL: 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">
4b9b3361

Ответ 1

В вашем случае недостаточно использовать имена классов.

  • 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 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
  • Низкая производительность
  • Tricky XPath

Пример:

driver.FindElement(By.XPath(".//li[.//ul/li/a[contains(@href, 'geo.craigslist.org/iso/us/al')]]/h5"));

Ответ 2

By.cssSelector(".ban") или By.cssSelector(".hot") или By.cssSelector(".ban.hot") должны выбрать его, если нет другого элемента, который имеет эти классы.

В CSS .name означает найти элемент, который имеет класс с name. .foo.bar.baz означает найти элемент, который имеет все эти классы (в одном элементе).

Однако каждый из этих селекторов будет выбирать только первый элемент, который соответствует ему на странице. Если вам нужно что-то более конкретное, отправьте HTML-код другим элементам, имеющим эти классы.

Ответ 3

Вы можете описать свой выбор css, например, каскадные таблицы стилей:

protected override void When()
{
   SUT.Browser.FindElements(By.CssSelector("#carousel > a.tiny.button"))
}