Я новичок с 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&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 для тестирования
Вы используете динамические атрибуты.
Моя первая рекомендация вам. Переключитесь на 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>
обратите внимание, что может быть выбрано более одного элемента.
Таким образом, проблема была в том, что страница не загружена. Зачем? Потому что 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);