gpt4 book ai didi

java - Selenium generic 搜索框架

转载 作者:行者123 更新时间:2023-12-02 09:29:35 24 4
gpt4 key购买 nike

我正在使用 selenium 和 java 进行自动化项目。项目应该能够在任何应用程序/网站上运行。所以我现在的问题是,由于每个网页可以包含无限数量的 iframe,我需要开发一个能够搜索和迭代所有 iframe 的功能,直到找到我正在寻找的元素。示例:我寻找 id="xx"的按钮来单击:

<iframe>
<iframe>
<iframe>
<iframe>
<iframe>
<iframe>
<iframe>
<iframe>
<iframe>
<iframe>
<iframe> <button id="xx" />

我尝试了递归方法,但这对我来说真的很难:

public static void searchFrame2(String buttonid) {
List<WebElement> frames = driver.findElements(By.tagName("iframe"));
boolean continuSearch = true;
if (!frames.isEmpty()) {
for (WebElement elem : frames) {
if (continuSearch) {
driver.switchTo().defaultContent();
driver.switchTo().frame(elem);
try {
driver.findElement(By.id(searchByValue)).click();
continuSearch = false;
} catch (Exception e) {
List<WebElement> childFrames = driver.findElements(By.tagName("iframe"));
if (childFrames.isEmpty()) {
continue;
} else {
for (WebElement element : childFrames) {
continuSearch = recursiveSearch(buttonid, element);
if (!continuSearch) {
break;
}
}
}
}
}
}
}
}

public static boolean recursiveSearch(String buttonid, WebElement currFrame) {
boolean continuSearch = true;
while (continuSearch) {
try {
driver.switchTo().frame(currFrame);
driver.findElement(By.id(buttonid)).click();
continuSearch = false;
} catch (Exception e) {// elem not found
List<WebElement> childFrames = driver.findElements(By.tagName("iframe"));
if (childFrames.isEmpty()) {
driver.switchTo().parentFrame();
return continuSearch;
} else {
for (WebElement element : childFrames) {
continuSearch = recursiveSearch(buttonid, element);
}
}
}
}
return continuSearch;
}

请有人帮助我,我已经被困在这个问题上三周了,我无法弄清楚。

最佳答案

我为此用 C# 编写了一些东西。您可以将其转换为 Java。存储库位于 https://github.com/zer0gr4v/testautomation201-iframe_switch

基本上,嵌套 iframe 类似于 n 叉树。( https://youtu.be/V4i7mdv1SMY )。下面是示例代码。

        if(parentIndex==0)@this.SwitchTo().DefaultContent();  
var iFrameList = @this.GetFrameElements(parentIndex);

foreach (var x in iFrameList)
{
@this.SwitchTo().Frame(x.Index);
var searchedElement = @this.FindElements(locatorStrategy).ToList();
if (searchedElement.Any())
return searchedElement;
@this.SwitchTo().ParentFrame();
}

//Element not found.. Check children
foreach (var x in iFrameList)
{
if (x.HasChildren)
{
@this.SwitchTo().Frame(x.Index);
var searchedElement = @this.GetElementInIFrames(locatorStrategy, parentIndex + 1);
if (searchedElement.Any())
return searchedElement;
@this.SwitchTo().ParentFrame();
}
}
return new List<IWebElement>();

关于java - Selenium generic 搜索框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58095496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com