我是测试自动化的新手。当我通过带有目标的Firepath定位元素时:
xpath=(//td[contains(@id, 'catProdTd_4723290')]/div/div[2]/h2)Firefox找到该元素并验证文本。但是,当我尝试使用Visual Studio2012和Selenium Web driver来定位这个元素时,我经常遇到错误:"Unable to locate element:{"method":"xpath","selector":"//tdcontains(@id,‘catProdTd_4723290’)/div/div/div2/h2“}”。
我试着逃走:
//td[@id=\"catProdTd_4723290\"]/div/div[2]/h2但是什么都没有。当我使用isElementPresent方法时,它会创建元素。在为WebDriver编写Xpath时,有什么特殊方法或规则应该使用吗?我定义了ISelenium变量WebDriver...单击工作,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进行测试
发布于 2013-09-23 22:55:10
您遇到了动态属性。
我给你的第一个建议。Switch to CSS。
我的第二个建议是,与其沸腾成一个完整的父子层次结构,为什么不直接使用KISS!
那么,让我们来看看你的问题。您正在尝试获取产品名称。简单..。我们可以在这里使用类。
css=td.productItem h2.product-name瞧,就是这么容易拿到的..我们没有使用这个巨大而丑陋的xpath选择器,而是将其简化为一个css选择器。
因此,下一个问题是,如果页面上有多个td.productItem,我们可以使用一些东西。
试一下,
css=td.productItem:nth-child(1) h2.productName这将选择包含类productItem的第一个td。
注意:您可能需要指定td的父级。例如css=div#container td.productItem:nth-child(1)
更多细节...
xpath失败的原因是分配给自动生成的<td>元素的catProdTd_4723290 id,使得该元素不可选。你可以通过执行starts with来解决这个问题。例如,使用css -
css=td[id^='catProdTd']将选择该<td>,但请注意,可能选择了多个元素。
发布于 2018-11-16 15:53:19
我建议在等待时使用这样的方法:
public bool boolWaitForElementIsDisplayed(By locator, int secondsToWait)
{
WebDriverWait Wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(secondsToWait));
try
{
var FoundElement = Wait.Until<Boolean>(d =>
{
try
{
return (d.FindElement(locator).Displayed && d.FindElement(locator).Enabled);
}
catch
{
return false;
}
});
}
catch (WebDriverTimeoutException)
{
return false;
}
return true;
}然后按如下方式检查:
IWebElement h2Element = null;
string xpath = "//td[contains(@class,'productItem')]/div/div[contains(@class,'product-main')]/h2";
if (boolWaitForElementIsDisplayed(By.XPath(xpath), 30))
h2Element = Driver.FindElement(xpath);发布于 2013-09-25 19:18:09
所以,问题是页面没有加载。为什么?因为WebElement.Click()不起作用。为什么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); https://stackoverflow.com/questions/18961658
复制相似问题