【问题标题】:Problematic parsing of html table with selenium webdriver使用 selenium webdriver 解析 html 表的问题
【发布时间】:2015-07-07 19:07:56
【问题描述】:

我正在使用 selenium webdriver 和 java 来测试我公司的 web 应用程序,我遇到了一个非常奇怪的问题。登录后的 Web 应用程序显示此表,其值如下链接中的图片所示:

https://drive.google.com/file/d/0B0i_2gNTlx1Sek9EQVQ1ZlY1a0E/view?usp=sharing

我编写了这段代码,它使用 xpath 解析表格,因为表格的行和 td 单元格是无 ID 的。

               //Parsing the table.
               int increment = 0;
               int i = 0;

               for(increment=1; increment <= 16; increment++){ 
                 StringBuilder nsb = new StringBuilder("");
                 StringBuilder sb = new StringBuilder("");

                for(i=1; i <= 6; i++){              

                    try {
                        WebElement f = wd.findElement((By.xpath("/html/body/div[1]/div/div[2]/div/div[2]/div[2]/div[2]/div/div[1]/form/div/div/table/tbody/tr["+increment+"]/td["+i+"]")));                                 
                        sb.append(f.getText().replaceAll("\\n", " ")).append(" ");                          
                    } catch (StaleElementReferenceException ed) {           
                        ed.getSuppressed();
                    }       

                }                           

                      System.out.println(sb);                                       
              }             
            System.out.println();

现在的问题是,当我有时以随机顺序打印每一行的值时,我会丢失输出中的一些值,如下图所示(例如,如果我第二次重新运行程序第二行中名为 SAB 的字段将丢失)。

正确的输出是 https://drive.google.com/file/d/0B0i_2gNTlx1SQmFoZDd0UkgzVXM/view?usp=sharing

我尝试用 getAttribute("textContent") 代替 getText 方法,但我遇到了同样的随机问题。

有人知道为什么会这样吗? 抱歉链接,但我没有其他选择来向您展示我的问题..如果需要,我还可以发布我在测试期间得到的随机错误输出..

【问题讨论】:

  • 给出web应用的html代码。
  • XPath 太可怕了!不要使用for 计数器循环。设置一个循环来迭代findElements(By.tagname('tr')),并设置一个内部循环来迭代findElements(By.tagname('td'))

标签: java firefox selenium xpath


【解决方案1】:

一个想法, 为什么要加?

                catch (StaleElementReferenceException ed) {           
                    ed.getSuppressed();
                }  

如果没有捕捉到,你会得到这个异常吗? 如果是,那么 可能是您的页面或元素正在刷新 当您在第二行将 f 引用到 getText() 时,您可能会得到 StaleElementReferenceException,但是当您抑制它时,您的循环会继续,并且 由于异常而丢失值

你可以试试替换

  WebElement f = wd.findElement((By.xpath("/html/body/div[1]/div/div[2]/div/div[2]/div[2]/div[2]/div/div[1]/form/div/div/table/tbody/tr["+increment+"]/td["+i+"]")));                                 
  sb.append(f.getText().replaceAll("\\n", " ")).append(" ");  

单条语句

  sb.append(wd.findElement((By.xpath("/html/body/div[1]/div/div[2]/div/div[2]/div[2]/div[2]/div/div[1]/form/div/div/table/tbody/tr["+increment+"]/td["+i+"]"))).getText().replaceAll("\\n", " ")).append(" ");

如果问题是由它引起的,这可能会避免 staleElement Exception。

【讨论】:

  • 为了避免出现此异常,必须切换到使用 ExpectedCondition 类而不是 thread.sleep() 以等待脚本完成加载。之后,我切换到 findElements() 并通过增强的 for 循环解决了丢失值的问题。感谢大家的建议。
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
相关资源
最近更新 更多