设置在Selenium和Java中查找的超时时间

时间:2019-03-29 16:54:08

标签: selenium xpath

我有这样的HTML

<tr>
  <td>
    <label>...</label>
  </td>
  <td>
    <input>...</input>
  </td>
  <td>
  </td>
</tr>
<tr>
  <td>
  </td>
  <td>
  </td>
  <td>
    <a>  ...</a>
  </td>
</tr>

您得到图片。几行(在这种情况下为3行),每行包含tds(在这种情况下为67行),并且只有一部分tds具有子元素。

我需要逐行查看每个td。如果没有子元素,那么我将从td中获取文本。如果有输入,则只有1个输入,我得到它的值。如果有两个输入,我得到的值是type =“ hidden”。

我用

找到行
 driver.findElements(By.xpath("blahblahblah//tr");

我遍历每一行并找到

 row.findElements(By.xpath("td"));

这没问题。但是然后我通过tds查找元素:

 td.findElements(By.xpath("*")) 

(请注意,这可以,因为它不是// *) 因此,如果td有子元素,它会立即返回。但是,如果没有,它会等待直到超时。

我做了

 driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

甚至是

 driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);

两者都不起作用,正如我期望的那样仅适用于

 driver.findelements(By.xpath)).

有没有办法为元素查找设置此超时时间?这些TDS没有ID 或其他任何方法,或者我只能做

 driver.findElements(By.xpath(xpath with id + "//*")); 

超时可能会起作用。

如果没有id或name或诸如此类的元素,是否有任何方法可以获取特定的xpath?

有两个问题:1:如何设置元素超时,2:如果有元素,如何为其获取xpath

1 个答案:

答案 0 :(得分:0)

我看不到超时的原因。只是您必须遍历所有行并获取数据。这是我写的脏代码。

    String value;
    int rows = driver.findElements(By.xpath("//table//tr")).size();
    int columns = driver.findElements(By.xpath("//table//tr[1]/td")).size();
    for(int row = 1; row <rows+1; ++row) {
        for (int col =1; col<columns+1; col++) {
            //now check if there are any children with input hidden
            if (driver.findElements(By.xpath("//table//tr["+ row +"]/td["+ col +"]/input[@type='hidden']")).size()>0) {
                value = driver.findElement(By.xpath("//table//tr["+ row +"]/td["+ col +"]/input[@type='hidden']")).getAttribute("value");
            }
            //now check if there are any children with input without hidden
            else if ((driver.findElements(By.xpath("//table//tr["+ row +"]/td["+ col +"]/input")).size()>0)) {
                value = driver.findElement(By.xpath("//table//tr["+ row +"]/td["+ col +"]/input")).getAttribute("value"); 

            }
            //just get text as there are no children input
            else {
                value = driver.findElement(By.xpath("//table//tr["+ row +"]/td["+ col +"]")).getText();
            }
            System.out.println("Row:" + row + " Col:" + col + " value:" + value);
            }
    }