Найти элемент в Selenium с помощью XPATH или CSS Selector

1

Я пытаюсь найти элемент "import" с помощью Selenium Webdriver в С#. Попробовали следующие коды, но ничего не нашли.

driver.FindElement(By.XPath("//*[@class='menu_bg']/ul/li[3]")).Click();
driver.FindElement(By.XPath("//*[@id='import']/a")).Click();
driver.FindElement(By.CssSelector("#import>a")).Click();
driver.FindElement(By.XPath("//*[@class='menu_bg']/ul/li[3]/a")).Click();
driver.FindElement(By.CssSelector("ul[@class='menu_bg']>li[value='3']")).Click();

Пожалуйста, помогите мне. Страница дизайна выглядит следующим образом:

<body>
    <div class="header_bg"></div>
    <div class="menu_bg">
        <ul class="menu">
            <li id="retrieve"></li>
            <li id="scan" class="test"></li>
            <li id="import">
                <a target="main" href="import/import.aspx" onclick="clickme(this,'import')">Import</a>
            </li>
            <li id="admin"></li>
            <li id="help"></li>
            <li style="float: right;"></li>
        </ul>
    </div> 
</body>

Все время я получил ошибку, как показано ниже:

unable to find the element
  • 0
    Попробуйте: driver.FindElement (By.XPath ("// li [@ id = 'import'] / a")). Click ();
  • 0
    Вы также можете попробовать: driver.FindElement (By.id ("import")). Click ();
Теги:
xpath
selenium-webdriver

3 ответа

2

Индексы XPath основаны на 1, в отличие от большинства других языков, на которых они основаны на 0.

Это означает, что вы на самом деле нацеливаете второй элемент li, у которого нет элемента anchor.

Так:

//*[@class='menu_bg']/ul/li[3]/a

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

  • 0
    +1, для того, чтобы указывать на XPath как этот, следует избегать в первую очередь.
  • 0
    @Arran: Спасибо за ваше предложение. Но все равно я получил следующую ошибку - Невозможно найти элемент с xpath == // * [@ class = 'menu_bg'] / ul / li [3] / a
Показать ещё 1 комментарий
1

Просмотрев эту ссылку (спасибо @Arran), проблема была исправлена. "переключение" на текущий IFrame направляет Selenium для отображения любых запросов к этому фрейму.

driver.SwitchTo().Frame() 
  • 1
    К сожалению, вы не показали нам, что на странице есть IFrames, поэтому мы не могли знать, что это решит проблему. Тем не менее, рад, что вы решили это :)
0

Вы можете сделать это, цепляя Selenium 'FindElement' так;

driver.FindElement(By.Id("import")).FindElement(By.TagName("a")); который даст вам дочерний элемент с идентификатором, который имеет тег 'a'.

Другой способ, которым вы могли бы это сделать, - IJavascriptExecutor ваш Driver в IJavascriptExecutor и выполнить javascript непосредственно в браузере с помощью селектора JQuery. Я считаю это лучше для более сложных поисков Selenium;

((IJavascriptExecutor)Driver).ExecuteScript("$("a[target='main'][href='import/import.aspx'])").click();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню