【问题标题】:I'm getting NoSuchElement exception error我收到 NoSuchElement 异常错误
【发布时间】:2017-08-23 19:36:58
【问题描述】:

我已经分享了以下代码,请告诉我更正

import org.openqa.selenium.By;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class MyClass {

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        /*System.setProperty("webdriver.ie.driver","D:\\Backup\\Documents\\Automation\\drivers\\IEDriverServer.exe");
        InternetExplorerDriver driver = new InternetExplorerDriver();
        driver.get("https://www.google.com");

        WebDriverWait driverWait = new WebDriverWait(driver,50);

        driverWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='lst-ib']"))).click();
        driver.findElementByXPath("//*[@id='lst-ib']").sendKeys("Make My Trip");
        driver.findElementById("_fZl").click();
        driverWait.until(ExpectedConditions.elementToBeClickable(By.linkText("MakeMyTrip, India's No 1 Travel Site | Book Hotels, Flights, Holiday ..."))).click();
        Screenshot S1 = new Screenshot();
        S1.Takescreen();*/
        String username = null;
        String password = null;
        MyClass C1 = new MyClass();
        C1.URLs(username, password);
    }

    public void URLs  (String username, String password) throws InterruptedException
    {

        System.setProperty("webdriver.ie.driver","D:\\Backup\\Documents\\Automation\\drivers\\IEDriverServer.exe");
        InternetExplorerDriver driver = new InternetExplorerDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://google.com");
        driver.findElement(By.className("lst lst-tbb sbibps")).sendKeys("irctc");
        driver.findElement(By.id("_fZl")).click();
        Thread.sleep(10000);
        driver.findElement(By.linkText("IRCTC Next Generation eTicketing System")).click();
        username = driver.findElement(By.id("usernameId")).getTagName();
        password = driver.findElement(By.className("loginPassword")).getTagName();
        System.out.println(username);
        System.out.println(password);           
    }
}

错误:

线程“主”org.openqa.selenium.NoSuchElementException 中的异常: 无法找到类名 == lst lst-tbb sbibps 的元素(警告: 服务器没有提供任何堆栈跟踪信息)命令 持续时间或超时:10.45 秒

【问题讨论】:

    标签: java selenium testing selenium-webdriver nosuchelementexception


    【解决方案1】:

    lst lst-tbb sbibps 实际上是 3 个不同的类。要使用所有这些,您可以使用cssSelector

    driver.findElement(By.cssSelector(".lst.lst-tbb.sbibps")).sendKeys("irctc");
    

    使用className,您只能使用一个类,尽管它们看起来都不独特

    driver.findElement(By.className("lst")).sendKeys("irctc");
    // or
    driver.findElement(By.className("lst-tbb")).sendKeys("irctc");
    // or
    river.findElement(By.className("sbibps")).sendKeys("irctc");
    

    【讨论】:

    • 感谢您的回复,我尝试使用 cssselector 仍然无法找到元素异常,并且我还尝试通过“Id”和类名​​查找元素,因为您没有提到任何帮助我找到元素
    • @GSelenium 你想在搜索框中输入内容吗?
    【解决方案2】:

    在 Google.com 中,通常有 3 个输入标签可供搜索,但其中 2 个具有 hidden =true 的属性

    <div id="gs_sc0" class="gsfi" style="background: transparent none repeat scroll 0% 0%; color: transparent; padding: 0px; position: absolute; z-index: 2; white-space: pre; visibility: hidden;"/>
    
    <input id="gs_taif0" class="gsfi" disabled="" autocomplete="off" aria-**hidden="true"** style="border: medium none; padding: 0px; margin: 0px; height: auto; width: 100%; position: absolute; z-index: 1; background-color: transparent; color: silver; left: 0px; visibility: hidden;" dir="ltr"/>
    
    <input id="gs_htif0" class="gsfi" disabled="" autocomplete="off" aria-hidden="true" style="border: medium none; padding: 0px; margin: 0px; height: auto; width: 100%; position: absolute; z-index: 1; background-color: transparent; color: silver; transition: all 0.218s ease 0s; opacity: 0; text-align: left; left: 0px;" dir="ltr"/>
    

    所以我们必须使用未隐藏的输入,在这种情况下使用

    driver.findElement(By.id("lst-ib")).sendKeys("irctc");
    

    【讨论】:

      【解决方案3】:

      正如@Guy 指出的那样,您尝试访问 3 个不同的类,因此不能对所有类使用 By.className 方法。

      我认为 Guy 的方法是正确的,但只有当您的用例与 Guy 所理解的完全一样时它才有效

      您的用例是什么?

      1. 您是否要访问 任一lstlst-tbbsbibps 的所有元素或
      2. 您是否要访问属于所有 3 个类lstlst-tbbsbibps 的所有元素或
      3. 是否要访问属于sbibps 类的所有元素,这是lst-tbb 的子类,lst-tbblst 的子类(即.lst.lst-tbb.sbibps

      解决方案

      1. 对于第一个用例,这应该足够了(请参阅Selenium Webdriver w/Java: locating elements with multiple class names with one command

      driver.findElements(By.cssSelector(".lst,.lst-tbb,.sbibps");

      1. 对于我发现的第二个用例(参见Find div element by multiple class names?

      driver.findElements(By.xpath("//*[@class='lst lst-tbb sbibps]"));

      或者这个,如果你不知道它是否有更多的类

      driver.findElements(By.xpath("//*[contains(@class, 'lst lst-tbb sbibps')]"));

      1. 对于最后一个用例,这应该可以工作(感谢@Guy)

      driver.findElements(By.cssSelector(".lst.lst-tbb.sbibps"));

      注意! 我使用了findElements 方法而不是findElement 方法,它会生成一个List 并且不会抛出异常,而如果条件是,则列表只是空的没有遇到。

      还有: 参考Need to find element in selenium by css

      【讨论】:

        【解决方案4】:

        试试下面的代码。

        driver.get("http://google.com");
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        
        driver.findElement(By.id("lst-ib")).sendKeys("irctc"); 
        
        WebDriverWait wait = new WebDriverWait(driver, 5);   //use explicit wait method for 5 seconds until element not found.
        wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.xpath("//a[text()='IRCTC Next Generation eTicketing System']"))));
        driver.findElement(By.xpath("//a[text()='IRCTC Next Generation eTicketing System']")).click();
        
        WebDriverWait homepage = new WebDriverWait(driver, 5);   //use explicit wait method for 5 seconds until element not found. Because when click on link button page is getting loading so wait for few seconds.
        homepage.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("usernameId"))));
        
        driver.findElement(By.id("usernameId")).sendKeys("Username");
        driver.findElement(By.xpath("//input[@class='loginPassword'][@type='password']")).sendKeys("XXXXX");
        

        注意:-不要使用Thread.sleep(),而是使用Explicit wait方法。

        【讨论】:

        • 如果解决了您的问题,请将此答案标记为Accepted
        【解决方案5】:

        使用以下:

        driver.findElement(By.name("q")).sendKeys("irctc");
        

        【讨论】:

          【解决方案6】:

          请使用以下代码,希望它有效。

          driver.findElement(By.className("gsfi")).sendKeys("irctc");
          

          【讨论】:

            【解决方案7】:

            试试下面的代码,它会在你的情况下工作(我在我的机器上测试过)。

            import java.util.concurrent.TimeUnit;
            import org.openqa.selenium.By;
            import org.openqa.selenium.ie.InternetExplorerDriver;
            
            public class MyClass {
            
            public static void main(String[] args) throws InterruptedException {
                String username = null;
                String password = null;
                MyClass C1 = new MyClass();
                C1.URLs(username, password);
            }
            
            public void URLs  (String username, String password) throws InterruptedException
            {
                System.setProperty("webdriver.ie.driver","D:\\Backup\\Documents\\Automation\\drivers\\IEDriverServer.exe");
                InternetExplorerDriver driver = new InternetExplorerDriver();
                InternetExplorerDriver driver = new InternetExplorerDriver();
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                driver.get("https://google.com");
                driver.findElement(By.id("lst-ib")).sendKeys("irctc");
                driver.findElement(By.id("_fZl")).click();
                Thread.sleep(10000);
                driver.findElement(By.linkText("IRCTC Next Generation eTicketing System")).click();
                username = driver.findElement(By.id("usernameId")).getTagName();
                password = driver.findElement(By.className("loginPassword")).getTagName();
                System.out.println(username);
                System.out.println(password);           
            }
            }
            

            让我知道它是否适合你。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-09-28
              • 1970-01-01
              • 2017-04-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多