您如何等待动态Web表格中的元素?

时间:2019-01-10 10:02:08

标签: java selenium selenium-webdriver web-scraping selenium-chromedriver

我在搜索框中输入一个值,然后Web表根据搜索开始加载其值。我不会转到新页面,页面本身也不会  令人耳目一新,这意味着我们仍在同一页面上。我想等待表的值加载而不必特别说“ wait X seconds”,我想在元素加载后立即获取它们。我该怎么做?

理想情况下,应该加载表中的所有值,但截至目前,我只是在尝试等待表中的第一个元素:

WebElement element =  (new WebDriverWait(driver, 10)).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"TableBox-react-component-2dd9bf99-63cb-4c78-9e0d-bed81526e7e5\"]/div/div[2]/table/tbody/tr[1]/td[1]/a")));

这最终在10秒后给我一个错误,因为它无法找到该元素。这是Selenium 2,chromedriver。

谢谢!

编辑:

HTML结构:

<head>...</head>
<body class="class-name" style>
  <div class="main">...</div>
  <script src="src-of-script"></script>
  <div class>
    <header class="page-header" uk-grid uk-panel uk-panel-box">...</header>
    <div class="teaching">
      <script type="application/json" class="js-react-on-rails-component" data-component-name="TableBox" data-dom-id="TableBox-react-component-*dynamic id*">
      <div id="TableBox-react-component-*dynamic id*>
        <div data-test="table-box" class="search-table-container">...</div>

2 个答案:

答案 0 :(得分:0)

您可以使用try and catch with recursion功能。创建一个带有try and catch块的方法,其中在try块中,放入Thread.sleet(seconds);然后调用findElement。在catch中再次调用该函数。我对Toast消息有问题,该消息会在指定的时间内动态生成,并通过这种方法解决了

答案 1 :(得分:0)

考虑到元素的id是动态的-它们的后缀在每次加载页面时都会更改,因此您可以尝试根据其恒定部分来定位。为此,xpath函数contains()非常方便。该定位器将选择样本中的最后一个<div>

//div[@class="teaching"]/div[contains(@id, "TableBox-react-component")]/div[@data-test="table-box"]

匹配/返回的元素将是<div>,其属性data-test等于“ table-box”(表达式中的最右边),其父元素是{{1} }的ID属性值中包含“ TableBox-react-component”。具有ID的<div>必须有一个<div>父级,其类值为“ teaching”。
在获得属性的确切恒定部分之前,可能要花很多时间才能出错,但这就是这里的想法。

确定定位器的这一部分后,您必须将元素向下附加到<div><table>上,才能到达实际的目标html元素。