1

更新 2

我正在使用 C# 和名为 GridView 的控件在.Net 上工作......所以 gridview 控件呈现并吐出这个 html 如下所示:这只是一个小的示例 html 源代码,TR我有 100 多个......

<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 之外我没有其他选择

结束更新 2

更新

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

结束更新

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

有时我会收到此错误消息:

Element is no longer valid

有时这样:

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

3 回答 3

2

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

于 2012-09-07T07:33:25.810 回答
1

我想你的最后一个问题;使用 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 更好。如果您仍然不确定如何使用它们,请阅读相关链接,它们写得很好,对我很有帮助。

于 2012-09-07T06:27:23.097 回答
1

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

于 2012-09-07T11:55:06.383 回答