0

我是测试自动化的新手。当我通过带有目标的 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 方法时,它会创建元素。在为 WebDriver 编写 Xpath 时,是否应该使用一些特殊的方法或规则?我定义了 ISelenium 变量,WebDriver... Clicks 有效,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 进行测试

4

3 回答 3

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分配给自动生成的元素的 id 导致该<td>元素无法选择。你可以通过做来解决这个问题starts with。例如,使用 css -

css=td[id^='catProdTd']

将选择但<td> 请注意,可能选择了超过 1 个元素。

于 2013-09-23T14:55:09.813 回答
0

我建议使用这样的方法等待:

 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);
于 2018-11-16T07:53:18.840 回答
-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); 
于 2013-09-25T11:18:09.493 回答