【问题标题】:Selenium HTML Table.. retaining WebElements clicking away from pageSelenium HTML Table.. 保留 WebElements 点击离开页面
【发布时间】:2019-02-24 02:44:27
【问题描述】:

我正在使用标准 HTML 表(tr(rows)、td(data))

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

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

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

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

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

因为每一步都会回到...

foreach (var row in rows)

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

有没有人遇到过这种情况,或者有没有人找到一个聪明的方法来处理我还没有遇到过的这种情况?

【问题讨论】:

    标签: c# html selenium webdriver


    【解决方案1】:

    我确实有类似的场景,我通过 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();
        }
    

    【讨论】:

    • 这不是只有在元素的类属性是整数时才有效吗?在这种情况下,每条 tr 行只有一个属性,即类,并且每一行在 class=odd 和 class=even 之间来回交替。考虑尝试类似的方法,看看是否可以使用 .ElementAt(i) 找到特定行。
    • 您也可以定义特定的行。但是我不明白您对 cme​​ts 的要求。
    • 我现在看到您在括号中指定索引。我最初评论时没有看到这一点。我试过这个,但我无法让它工作。得到一个“nosuchelementexception”。
    • @HeadlyvonNoggin 所以你需要专注于你的目标元素。你在哪里定位,如果它的页面不同,那么你需要等待显式等待或睡眠
    【解决方案2】:

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

    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.
    

    【讨论】:

    • 我在“返回”点击后尝试过。我试图通过重做 findelements 行来刷新“行”元素,但我仍然得到 staleelementexception。
    • 在再次查找行之前添加一些睡眠。
    • 我怀疑这可能发生得太快了。我会试试的。
    【解决方案3】:

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

    您必须计算行数并循环遍历该数字。

    List<WebElement> rows = new List<WebElement>(table.FindElements(By.TagName("tr")));
    var rowsCount = rows.Count;
    for(int i=0; i<rowsCount; i++)
    {
        var row = rows[i];
        // do what you need to do on this row e.g. row.Click();
        row.Click();
    
        // click back and wait 
        back.Click();
        System.Threading.Thread.Sleep(10000);
    
        rows = new List<WebElement>(table.FindElements(By.TagName("tr")));
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      相关资源
      最近更新 更多