Selenium HTML Table ..保留从页面离开的WebElements

时间:2018-09-19 20:54:58

标签: c# html selenium webdriver

我正在使用标准的HTML表(tr(行),td(数据))

对于每条记录,我必须单击每行的详细信息页面,以确定它是否是继续测试过程的有效策略。

无效时,脚本单击页面上的后退按钮以返回到策略表。但是,当然,由于浏览器离开了表页面,因此表中的WebElement已经过时,无法再访问。

我试图将网络元素存储在这样的列表中...

List<IWebElement> rows = new List<IWebElement>(table.FindElements(By.TagName("tr")));

...但是这不能解决元素过时的问题。

因为每个步骤都返回到...

foreach (var row in rows)

...行,这当然是在存储Webelements之后出现的,我还没有找到一种在继续之前先重新存储tr Webelements的方法。

有人遇到过这种情况吗?还是有人找到了解决这种情况的聪明方法?

3 个答案:

答案 0 :(得分:0)

从策略详细信息页面返回到策略表页面时,需要在策略表页面上再次查找行。

List<IWebElement> rows = new List<IWebElement>
                         (table.FindElements(By.TagName("tr")));

foreach (var row in rows) {

   ...
   // click back button on detail page
   backButton.click()
   // find the rows on table page again
   sleep(<5-10 seconds>) for debug purpose,
   rows = new List<IWebElement>(table.FindElements(By.TagName("tr")));

}

// I'm not suer the foreach can remain the next iterate index even
// I assign new value to the `rows`.  If foreach can't work in such case,
// change to `for(var i=0;i<length;i++)` pattern.

答案 1 :(得分:0)

我确实有类似的情况,并且我通过for循环执行它。

您可以参考此示例(语法属于Java,您可以根据C#引用它)

public void locateElement(int i) {
    driver.findElement(By.xpath("(//a[@class=''])[" + i + "]")).click();
}

    try {
        List<WebElement> rows = new List<WebElement>(table.FindElements(By.TagName("tr")));

        for (int i = 1; i <= rows.size(); i++) {

            //To locate on main page, need to use i for each row
            locateElement(i);   

            rows = new List<IWebElement>(table.FindElements(By.TagName("tr")));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

答案 2 :(得分:0)

导航到其他URL时,无法保留元素列表,因为DOM已被清除,因此所有引用都将被清除。

您必须对行进行计数并遍历该数字。

|| *id*  || *post_title*            || *post_name*          || *brand_title* || *brand_name*   || *size_title*     || *size_name*
|| 758   || Item recordado 88 Item  || item-recordado-88    || Brand Test 04 || brand-test-04  || 200 ml / 6.8 oz  || 200-ml-6-8-oz