Selenium IDE Xpath против веб-драйвера Xpath

0

Я новичок с Test Automation. Когда я размещаю элемент через Firepath с целью:

 xpath=(//td[contains(@id, 'catProdTd_4723290')]/div/div[2]/h2)

Firefox находит этот элемент и проверяет текст. Но, когда я пытаюсь найти этот элемент с Visual Studio 2012 и Selenium Web-драйвером, у меня постоянно возникает ошибка: "Невозможно найти элемент: {" method ":" xpath "," selector ":"//td [contains (@id, 'catProdTd_4723290')]/div/div [2]/h2 "}".

Я попытался убежать:

//td[@id=\"catProdTd_4723290\"]/div/div[2]/h2

но ничего. Когда я использую метод isElementPresent, он обнаруживает элементы. Есть ли какой-то специальный метод или правило, которое следует использовать при написании Xpath для WebDriver? Я определил переменную ISelenium, WebDriver... Clicks works, WaitForPageToLoad работает, но это не может найти элемент.

IWebElement we= driver.FindElement(By.XPath("//td[contains(@id, 'catProdTd_4723290')]/div/div[2]/h2"));

HTML со страницы:

<td class="productItem" id="catProdTd_4723290"><div class="product-details">
    <div class="product-aside"> <img border="0" alt="Fork and Spoon Set" src="/_photos/store/glass-large.jpg" id="catlproduct_4723290">
     </div>
    <div class="product-main">
    <h2 class="product-name">Fork and Spoon Set</h2>
    <div class="price"><strong>$17.99</strong></div>
    <hr>

    <div class="attributes"></div>
    <hr>
    <div class="product-col-1">
    <div class="qty"> Quantity: <strong><input type="text" value="1" name="AddToCart_Amount" class="productTextInput" id="Units_4723290"></strong></div>
    <div class="stock">(N/A in-stock)</div>
    </div>
    <div class="product-col-2">
    <input type="submit" onclick="AddToCart(192951,4723290,'',4,'','',true);return false;" value="Buy Now" name="AddToCart_Submit" class="productSubmitInput">
    <div class="wish"><a href="/FavoriteProcess.aspx?OID=4723290&amp;OTYPE=27" class="favoritelink">Add to Wishlist</a></div>
    </div>
    <div class="product-description">
    <h4>Product Information:</h4>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit.  Aenean
    commodo ligula eget dolor.  Aenean massa.  Cum sociis natoque penatibus
     </div>
    </div>
    <!-- End Main -->
    </div>
    <!-- End Product Details -->
</td>

Я должен добавить, что я стараюсь ждать во время отладки и с

Manage().Timeouts().ImplicitlyWait

но ничего. Это происходит и в других местах. Я использую Firefox для тестирования

Теги:
selenium
webdriver

2 ответа

2

Вы используете динамические атрибуты.

Моя первая рекомендация вам. Переключитесь на CSS.

Моя вторая рекомендация, вместо того, чтобы кипеть во всей иерархии родителей и детей, почему бы вам просто не KISS !

Итак, давайте посмотрим на вашу проблему. Вы пытаетесь получить имя продукта. Просто.. мы можем использовать классы здесь.

css=td.productItem h2.product-name

вуаля, это было легко получить.. вместо того, чтобы иметь этот огромный уродливый селектор xpath, мы упростили его до селектора css.

Итак, на следующую проблему, если у нас есть несколько td.productItem на странице, мы можем использовать пару вещей.

Пытаться,

css=td.productItem:nth-child(1) h2.productName

Это выберет первый td с классом productItem.

примечание: вам может потребоваться указать родителя td.. например, css=div#container td.productItem:nth-child(1)

Подробнее...

Причина, по которой ваш xpath терпит неудачу, catProdTd_4723290 тем, что catProdTd_4723290 id, назначенный элементу <td>, генерируется автоматически, что делает этот элемент невыбираемым. Вы можете обойти это, starts with. например, css -

css=td[id^='catProdTd']

выберет, что <td> обратите внимание, что может быть выбрано более одного элемента.

  • 1
    Это фантастический ответ. @garvan, если вы хотите больше информации о селекторах, PDF-файлы на этой странице мне очень помогли: simple-talk.com/dotnet/.net-framework/…
  • 0
    Я пробовал CSS-селекторы (хотя я думал, что они работают только с xpath): ошибка «Невозможно найти элемент ...» продолжается. Я попытался найти элементы на другом сайте, на котором нет динамически сгенерированных элементов, и снова «Невозможно найти элемент ...». Это сводит меня с ума, в Firepath локации находится либо xpath, либо css, но при переходе через Visual Studio и WebDriver «FindElement» не может его найти ?!
-1

Таким образом, проблема была в том, что страница не загружена. Зачем? Потому что WebElement.Click() не работает. Почему не работает? Я не знаю. Я разрешил проблему с кликами с помощью JavascriptExecutor:

IJavaScriptExecutor executor = (IJavaScriptExecutor)chauffeur;
IWebElement webel1 = chauffeur.FindElement(By.CssSelector("#nav ul:nth-child(1) li:nth-child(2) a[href='/products']")); 

Вместо того, чтобы использовать

webel1.Click(); 

который не работает, я использовал:

executor.ExecuteScript("arguments[0].click();", webel1); 

Ещё вопросы

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