如何使Selenium测试脚本始终有效?

时间:2012-09-06 22:58:17

标签: selenium webdriver selenium-webdriver

更新2

我正在使用带有名为GridView的控件的C#工作...所以gridview控件渲染并吐出这样的html:这只是一个小样本html源TR我喜欢100s那... ...

<tr class="item">
<td align="center">
<td align="center" style="width:15px;"/>
<td>John John</td>
<td/>
<td>Friendship</td>
<td/>
<td>
<td>9/7/2012 6:28:29 PM</td>
</tr>

所以,我试图找出John John是否存在,这是我最终如何使用XPATH

        int pageCount = 100;
        bool assertFlag = false;
        for (int i = 0; i < pageCount; i++) 
        {
            try
            {
                string _Id = String.Format("//*[@id='ctl00_ContentPlaceHolder1_AddeCardControl1_gridview_control']/tbody/tr[{0}]/td[3]", i);
                string _txt = GetText(By.XPath(_Id));

                if (_txt == "some text comparing here")
                {
                    //matched
                    assertFlag = true;
                    break;
                }
            }
            catch (Exception e)
            {
                //
            }
        }
你觉得伙计们怎么样?还是我做了一件可怕的错误?

PS:我没有ID或CSS选择器,所以除了使用XPATH之外别无其他选择

END UPDATE 2

更新

我正在使用Selenium WebDriver 2和C#,我正在使用IE 8和FF

END UPDATE

我仍然不确定是什么导致此错误被抛出所以我有脚本并且它工作,当我第二次运行失败并得到以下消息...如果我继续运行不止一次然后有时它工作,有时不...我该怎么办?是什么导致这个错误?任何见解?

有时我收到此错误消息:

Element is no longer valid

有时这样:

Unable to find element with xpath == //*[@id='ctl00_ctl00_ctl00_LeftNavigation_LeftNavigation_LeftNavigationControl1_rptLeftNav_ctl14_lnkText']

3 个答案:

答案 0 :(得分:2)

对于第一种情况(元素不再有效):
当您长时间使用元素对象时,它会给您一个错误,例如“元素不再附加到DOM”这不是一致性。 解决方案是您必须再次找到该元素 第二个(无法找到带有xpath的元素== // * [@ id = .....):
在Xpath中,您提到了*而不是特定标记。如果在这些情况下您有不同的标签具有相同的ID,则无法选择哪一个。所以请提及正确的标签名称。您可以在Firefox中使用FirePath验证xpath。

答案 1 :(得分:1)

我想你的最后一个问题; Getting Timeout using Selenium Webdriver有很多好东西。这与你提出的问题有关。如果使用一种类型的定位器找不到元素,请尝试其他类型。

我也忍不住注意到你正在为IE使用xpath定位器。有一个非常好的网络研讨会,说明为什么你不应该在IE中(通常)使用xpath,因为速度问题,这可能会导致你当前的一些问题。

以下是链接:http://sauceio.com/index.php/2011/05/why-css-locators-are-the-way-to-go-vs-xpath/。网络研讨会调查了CSS优于xpath的原因,尤其是IE。除了CSS之外,你所获得的错误可能是由你的盒子设置到你正在使用的浏览器引起的,毕竟网络自动化并不是一门精确的科学。地狱你也可能有一个错误......这不是你首先要测试的吗?

修改

所以你的更新对我来说有点奇怪,因为你完全从寻找具有个人id的东西下的多个元素转向寻找标签中的元素。关于你当前的更新,我建议只使用css定位器说

driver.FindElement(By.CssSelector("td:contains('John John')"))

如果无法找到您的标签,您无疑会被告知。正如我前面提到的,css定位器完成与xpath相同的功能,但它们更快,在IE中工作得更好。是的,他们不会100%的时间工作。也许在100分中有5次你需要在css上使用xpath,但整体css是优越的。如果您仍然不确定如何使用它们,请阅读相关链接,它们写得很好,对我很有帮助。

答案 2 :(得分:1)

坦率地说,我不喜欢你在xPath中提到的id类型。尝试使用css选择器找到所需的元素。并验证您是否在firepath(firebug addon)中找到了它。 在运行seleniumt测试套件时,我总是避免使用像<span id="j_idt12:j_idt13">这样的ID,因为它们可能会有所不同。因此,更好的方法是使用元素的整个路径将我们的元素直接指向DOM。使用这种方法可以避免像Element“不再有效”或“无法定位”这样的不一致