java - 循环遍历 div 中的页面链接,然后单击 Selenium (java) 中包含特定值的每个链接

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

我有一个 html 页面,其中有一个部分的结构如下:

<section id="fl-results" class="fl-results-revenue">
	<li data-tab="details" class="ui-state-default ui-corner-top" role="tab">
		<a class="toggle-flight-block-details ui-tabs-anchor" href="#flight-details-1" tabindex="-1" id="ui-id-3">Details</a>
	</li>
	<!-- Some html -->
	<li data-tab="details" class="ui-state-default ui-corner-top" role="tab">
		<a class="toggle-flight-block-details ui-tabs-anchor" href="#flight-details-2" tabindex="-1" id="ui-id-5">Details</a>
	</li>
	<!-- Some html -->
	<li data-tab="details" class="ui-state-default ui-corner-top" role="tab">
		<a class="toggle-flight-block-details ui-tabs-anchor" href="#flight-details-3" tabindex="-1" id="ui-id-8">Details</a>
	</li>
	<!-- Some html -->
	<li data-tab="details" class="ui-state-default ui-corner-top" role="tab">
		<a class="toggle-flight-block-details ui-tabs-anchor" href="#flight-details-4" tabindex="-1" id="ui-id-19">Details</a>
	</li>
</section>

现在我想单击所有包含 id fl-results 部分的链接以获取详细信息。 在我的代码中,我等待元素可单击(这是有效的),然后尝试单击所有元素:

wait.until(ExpectedConditions.elementToBeClickable(By.className("toggle-flight-block-details")));

当我尝试下面的代码时,它仅在单击第一次出现的链接时打开:

driver.findElement(By.className("toggle-flight-block-details")).click();

我看到一篇文章建议使用 cssSelector

driver.findElement(By.cssSelector("a[href*='flight-details-1']")).click();

这需要我遍历此类的所有链接。迭代有效,但单击出现错误

//loop through page and click all link details
List<WebElement> allLinksWebpage = driver.findElements(By.className(waitCondition));
int k = allLinksWebpage.size();
for(int i=0;i<k;i++)
{
    if(allLinksWebpage.get(i).getAttribute("href").contains("flight-details"))
    {
        String waitCondition = "flight-details-"+(i+1);
        String link = allLinksWebpage.get(i).getAttribute("href");
        driver.findElement(By.cssSelector("a[href*='"+waitCondition+"']")).click();
    }
}

给出的错误是:

Exception in thread "main" org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element ... is not clickable at point (392, 730). Other element would receive the click: ...

我看到了post关于类似的错误,它说要使用 javascript,因为它与 chrome 有关,但我不知道在我的情况下如何实现?

我使用的是 google chrome 驱动程序版本 83.0.4103.97。

我正在查看的 HTML 页面是 United Airline 的航类搜索结果页面

最佳答案

您可以使用以下方法获取 section Web 元素中包含类名 toggle-flight-block-details 的所有 Web 元素:

WebElement section = driver.findElement(By.id("fl-results"));
List<WebElement> detailsList = section.findElements(By.className("toggle-flight-block-details"));

然后您可以迭代 detailsList 并使用 JavascriptExecutor 单击它们

JavascriptExecutor js = (JavascriptExecutor) driver;
for (int i = 0; i <detailsList.size(); i++) {
    js.executeScript("arguments[0].click();", detailsList.get(i));
}

关于java - 循环遍历 div 中的页面链接,然后单击 Selenium (java) 中包含特定值的每个链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62353516/

相关文章:

java - 通过 ExpectedCondition 方法 PresenceOfElementLocated() 使用 WebDriverWait 时出错

java - 无法验证包含变音符号的文本

java - Java中基于Request在后台运行servlet

java - 如何比较表示为 long 和 int 的小数?

java - 删除 HQL 中带有对象的所有从站

java - 如何使用 Java 在 Selenium 中通过文本查找 Web 元素?

java - 无法通过 TestNG 执行测试用例

javascript - Protractor TAB 键已停止改变焦点,现在正在添加空格

java - Spring 安全@PreAuthorize ("hasAnyRole(' ... .')")

java - Selenium 代码在延迟加载的 Web 元素中水平滚动