【发布时间】:2019-01-10 10:02:08
【问题描述】:
我在搜索框中输入一个值,然后 Web 表开始根据搜索加载其值。我没有转到新页面,页面本身也没有 令人耳目一新,这意味着我们仍然在同一页面上。我想等待表的值加载而不必专门说“等待 X 秒”,我想在元素加载后立即获取它们。我该怎么做?
理想情况下,应该加载表中的所有值,但现在我只是试图等待表中的第一个元素:
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>
【问题讨论】:
-
我很确定问题出在您使用的定位器上 - 它看起来像是从浏览器生成的(而且这些都是非常脆弱的),另外还有一个 @987654323 @ 属性的值几乎可以肯定是动态的。这意味着在每个页面加载中,实际定位器都会有所不同,因此您的等待将失败。添加 HTML 源代码,我们将帮助您构建更可靠的源代码。
-
@TodorMinakov 感谢您抽出宝贵时间回复我的问题。我认为您所说的内容是正确的,当我重新加载页面时,表格会获得一个新的 ID。所以,每次我运行我的程序时,它都会输入错误的表 ID。表的 ID 在分页期间不会改变 - 这很好。但是,那我该如何定位桌子呢?是否可以从表格上方的行中的 JavaScript 属性“data-dom-id”中获取 id?
标签: java selenium selenium-webdriver web-scraping selenium-chromedriver