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



我有一个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();
}
}

给出的错误是:

线程"main"中的异常 org.openqa.selenium.ElementClickInterceptedException: element click 截获:元素...在点 (392, 730(. 其他元素将收到点击:...

我看到一篇关于类似错误的帖子,它说改用 javascript,因为它与 chrome 有关,但我不知道如何在我的情况下实现它?

我正在使用谷歌浏览器驱动程序版本 83.0.4103.97。

我正在查看的 HTML 页面是来自联合航空公司的航班搜索结果的页面

您可以使用以下命令获取包含类名的所有 Web 元素sectionWeb 元素中toggle-flight-block-details;

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));
}

而不是这一行:

List<WebElement> allLinksWebpage = driver.findElements(By.className(waitCondition));

#Update 这里

另一种方法是使用此css选择器:section#fl-results li a.toggle-flight-block-details,使用.visibilityOfAllElementsLocatedBy将它们收集到一个列表中。

for each提取:

WebDriverWait wait = new WebDriverWait(driver, 20);
//update here
List<WebElement> allLinksWebpage = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("section#fl-results li a.toggle-flight-block-details")));
for(WebElement element: allLinksWebpage) {
if(element.getAttribute("href").contains("flight-details")) {
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
wait.until(ExpectedConditions.elementToBeClickable(element));
((JavascriptExecutor) driver).executeScript("arguments[0].click();", element);
}
}

请参阅上述如何使用JavascriptExecutor实现arguments[0].click();

您需要以下导入:

import org.openqa.selenium.JavascriptExecutor;

但是我想每次点击Details链接,都会出现详细信息并使页面结构发生变化,所以接下来Details转到底部,然后单击之前将此参数放在arguments[0].scrollIntoView(true);

相关内容

  • 没有找到相关文章

最新更新