无法在 java selenium 中找到元素

Unable to locate element in java selenium

提问人:Bug Hunter 提问时间:7/18/2023 更新时间:7/19/2023 访问量:35

问:

大家好,我无法在最后一行代码上与“索引”交互,代码对所有项目都正常工作,除了嵌套框架,它给出错误,因为无法找到元素,我已经尝试了 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();


}

}
java selenium-webdriver 嵌套

评论

0赞 undetected Selenium 7/18/2023
你到底被困在哪条线上?
0赞 Bug Hunter 7/18/2023
点击frametest后出现此问题
0赞 undetected Selenium 7/19/2023
查看答案并让我知道状态。

答:

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

在网站“自动化测试页面”中,单击带有文本作为“框架测试页面”的链接并导航到“嵌套框架示例页面后,将文本作为索引的元素位于<框架中>

frame


溶液

要单击以文本为索引的元素,您必须:

  • 诱导 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();
    

引用

您可以在以下位置找到一些相关讨论: