我在搜索框中输入一个值,然后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>
答案 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元素。