java.lang.ClassCastException: java.base/java.lang.String 在通过 Selenium 执行测试时无法转换为 org.openqa.selenium.WebElement

java.lang.ClassCastException: java.base/java.lang.String cannot be cast to org.openqa.selenium.WebElement when executing test through Selenium

我正在尝试在 Selenium WebDriver 中进行自动化测试,但 Eclipse 向我显示以下错误:

java.lang.ClassCastException: java.base/java.lang.String cannot be cast to org.openqa.selenium.WebElement

这是我的代码:

public void SeachApp()
{
    Object elem = driver.getPageSource().contains("Staffing");

    if (elem != null)
    {
        System.out.println("Encontrado");
        int width = ((WebElement) elem).getSize().getWidth();

        Actions act = new Actions(driver);
        act.moveToElement((WebElement) elem)
            .moveByOffset((width / 2) - 15, 0)
            .click()
            .perform();
        }
        else
        {
            System.out.println("Não Encontrado");
        }
    }

这是怎么回事,我该如何解决?

getPageSource()

根据文档 getPageSource() returns 当前页面的来源 并定义为:

Get the source of the last loaded page. If the page has been modified after loading (for example, by Javascript) there is no guarantee that the returned text is that of the modified page. You need to follow the documentation of the particular driver being used to determine whether the returned text reflects the current state of the page or the text last sent by the web server. The page source returned is a representation of the underlying DOM: do not expect it to be formatted or escaped in the same way as the response sent from the web server.


包含()

contains()方法是一个Java方法来检查String是否包含另一个substring 与否。它returns 布尔值所以它可以直接在if语句中使用。


分析

您使用过的表达方式:

driver.getPageSource().contains("Staffing");

将 return 一个 布尔值 但被转换为 Object 类型的对象。此外,当您尝试将 Object 类型的对象转换为 WebElement 类型时,您会看到以下错误:

java.lang.ClassCastException: java.base/java.lang.String cannot be cast to org.openqa.selenium.WebElement

解决方案

如果您希望找到 WebElement,您必须使用以下任一方法:

现在,如果您希望获取文本为 StaffingWebElement(无需参考相关 HTML)可以使用如下解决方法:

WebElement element = driver.findElement(By.xpath("//*[contains(text(),'Staffing')]"));

现在,一旦找到 WebElement,您就可以使用 WebElement.[=25= 轻松执行剩余的任务]