Ответ 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"));