提问人:Bug Hunter 提问时间:7/18/2023 更新时间:7/19/2023 访问量:35
无法在 java selenium 中找到元素
Unable to locate element in java selenium
问:
大家好,我无法在最后一行代码上与“索引”交互,代码对所有项目都正常工作,除了嵌套框架,它给出错误,因为无法找到元素,我已经尝试了 xpath 和链接文本,但仍然收到此错误,这是一个用于测试自动化实践的演示网站,错误仅适用于代码最后一行的索引代码的其他部分工作正常。
package sdet;
import org.openqa.selenium.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.WebElement;
import java.awt.event.ActionEvent;
import java.time.Duration;
import java.util.*;
public class selenium {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.setProperty("Pathtochromedriver");
WebDriver driver = new ChromeDriver();
driver.get("https://testpages.herokuapp.com/");
driver.manage().window().maximize();
// Clicking on basic webpages //
driver.findElement(By.id("basicpagetest")).click();
String Urlnow = driver.getCurrentUrl();
System.out.println("current url is :" +Urlnow );
driver.findElement(By.linkText("Index")).click();
driver.findElement(By.id("elementattributestest")).click();
Thread.sleep(2000);
driver.navigate().forward();
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250,350)");
Thread.sleep(2000);
WebElement Addattribute = driver.findElement(By.xpath("//button[@class=\"styled-click-button\"]"));
Actions actions = new Actions(driver);
actions.moveToElement(Addattribute).doubleClick().build().perform();
Thread.sleep(2000);
driver.navigate().forward();
js.executeScript("window.scrollBy(0,-400)");
// Clicking on index here //
driver.findElement(By.linkText("Index")).click();
driver.findElement(By.id("findbytest")).click();
Thread.sleep(2000);
driver.findElement(By.linkText("Index")).click();
driver.findElement(By.id("tablestest")).click();
Thread.sleep(2000);
driver.findElement(By.linkText("Index")).click();
driver.findElement(By.id("dynamictablestest")).click();
Thread.sleep(2000);
driver.findElement(By.linkText("Index")).click();
driver.findElement(By.id("alerttest")).click();
driver.findElement(By.id("alertexamples")).click();
driver.switchTo().alert().accept();
// Clicking on show confirm box //
driver.findElement(By.id("confirmexample")).click();
Thread.sleep(2000);
driver.switchTo().alert().dismiss();
Thread.sleep(2000);
driver.findElement(By.linkText("Index")).click();
driver.findElement(By.id("fakealerttest")).click();
// Clicking on showalertbox //
driver.findElement(By.id("fakealert")).click();
driver.findElement(By.id("dialog-ok")).click();
// Clicking on modal dialog //
driver.findElement(By.id("modaldialog")).click();
driver.findElement(By.id("dialog-ok")).click();
Thread.sleep(2000);
driver.findElement(By.linkText("Index")).click();
// Clicking on frames test //
driver.findElement(By.id("framestest")).click();
Thread.sleep(4000);
driver.navigate().forward();
driver.findElement(By.linkText("Index")).click();
//driver.findElement(By.id("framestest")).click();
//Thread.sleep(2000);
//driver.findElement(By.linkText("Index")).click();
}
}
答:
1赞
Yaroslavm
7/18/2023
#1
只要在该页面上将 Index 元素放置在框架中,您应该使用
driver.switchTo().frame("top");
以前
driver.findElement(By.linkText("Index")).click();
其中 是 iframe 的 name 属性。top
默认情况下,Selenium 使用顶级身体级上下文,并且看不到其他上下文(如 iframe 或 shadow-roots)中的元素。 因此,为了让他知道你想在另一个上下文中搜索元素,你应该改变 Selenium 正在研究的上下文。
当你回到身体环境时,别忘了切换到后面。defaultContext()
1赞
Shawn
7/18/2023
#2
使用以下行:
driver.switchTo().frame(0);
(0)
- 是 HTML 上的第一帧。
所以你的最后 4 行代码应该如下:
Thread.sleep(4000);
driver.navigate().forward();
driver.switchTo().frame(0);
driver.findElement(By.linkText("Index")).click();
注意:要切换回默认内容,应使用以下代码行:
driver.switch_to.default_content()
0赞
undetected Selenium
7/19/2023
#3
在网站“自动化测试页面”中,单击带有文本作为“框架测试页面”的链接并导航到“嵌套框架示例”页面后,将文本作为索引的元素位于<框架中>
:
溶液
要单击以文本为索引的元素,您必须:
诱导 WebDriverWait 获取所需的帧 ToBeAvailableAndSwitchToIt。
诱导 WebDriverWait 所需的元素 ToBeClickable。
您可以使用以下任一定位器策略:
ChromeOptions options = new ChromeOptions(); options.addArguments("--start-maximized"); WebDriver driver = new ChromeDriver(options); driver.get("https://testpages.herokuapp.com/styled/index.html"); new WebDriverWait(driver, Duration.ofSeconds(5)).until(ExpectedConditions.elementToBeClickable(By.id("framestest"))).click(); new WebDriverWait(driver, Duration.ofSeconds(5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("top"))); new WebDriverWait(driver, Duration.ofSeconds(5)).until(ExpectedConditions.elementToBeClickable(By.linkText("Index"))).click();
引用
您可以在以下位置找到一些相关讨论:
评论