【问题标题】:org.openqa.selenium.NoSuchElementException: no such elementorg.openqa.selenium.NoSuchElementException:没有这样的元素
【发布时间】:2013-12-01 13:03:21
【问题描述】:

运行 Selenium WebDriver 2.37.1

我在运行测试时遇到间歇性问题并收到以下错误:

org.openqa.selenium.NoSuchElementException: no such element

有时测试会通过,但大多数时候会失败。下面是堆栈跟踪:

org.openqa.selenium.NoSuchElementException: no such element  
(Session info: chrome=31.0.1650.57)
(Driver info:
chromedriver=2.6.232923,platform=Windows NT 6.1 SP1 x86_64) 
(WARNING:
The server did not provide any stacktrace information) 
Command duration or timeout: 10.04 seconds 
For documentation on this error, please visit:
http://seleniumhq.org/exceptions/no_such_element.html 
Build info:
version: '2.34.0', revision:
'11cd0ef93615408e0b6b3bfa28defe125906461a', time: '2013-08-06
11:43:14' 
System info: os.name: 'Windows 7', os.arch: 'amd64',
os.version: '6.1', java.version: '1.7.0_45' 
Session ID:
2375dca8adea8bb6962b0c87861cdd59 
Driver info:
org.openqa.selenium.chrome.ChromeDriver 
Capabilities

下面是我执行测试的代码:

@Test
public void loginPage(){

    chrome.get("http://thisisafakeurl.com");
    //entering username
    WebElement usernameField = chrome.findElement(By.cssSelector("input[type='text'][id='usernameInput']"));
        usernameField.sendKeys("fakeusername");
    //entering password
    WebElement passwordField = chrome.findElement(By.cssSelector("input[id='passwordInput']"));
        passwordField.sendKeys("fakepassword");
    //clicking submit button
    chrome.findElement(By.cssSelector("input#loginBtn.rightButton")).click();

    chrome.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    //asserting a css selector. Not really needed. Just thrown in to learn.
   // WebElement blankProjectLocator = chrome.findElement(By.cssSelector("li.iconGridItem[data-id='5']"));
   // Assert.assertEquals("5", blankProjectLocator.getAttribute("data-id"));

    //Clicking the Blank Project button

    Actions actions = new Actions(chrome);
    WebElement item1 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/img[1]"));
    WebElement item2 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/img[2]"));
    WebElement item3 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/header/span"));
    WebElement item4 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]"));

    actions.moveToElement(item4)
           .moveToElement(item1)
           .moveToElement(item2)
           .moveToElement(item3)
           .click().build().perform();

    chrome.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);





    //Dragging the Click Area component onto the canvas
    WebElement listContainer = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
    WebElement componentList = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
    WebElement clickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]"));
    WebElement arrowHead = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[1]"));
    WebElement imageHolderClickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[1]/div"));
    WebElement componentNameClickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[2]"));


    WebElement canvas = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));

    actions.moveToElement(listContainer)
           .moveToElement(componentList)
           .clickAndHold(clickArea)
           .moveToElement(arrowHead)
           .moveToElement(imageHolderClickArea)
           .moveToElement(componentNameClickArea)
           .moveToElement(canvas)
           .release().perform();

    chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);






    //Dragging the close button onto the canvas

    WebElement listContainerClose = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
    WebElement componentListClose = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
    WebElement closeButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]"));
    WebElement componentThumb = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[1]"));
    WebElement imageHolderCloseButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[1]/div"));
    WebElement componentNameCloseButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[2]"));

    WebElement canvas1 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));

    actions.clickAndHold(closeButton)
            .moveToElement(listContainerClose)
            .moveToElement(componentListClose)
            .moveToElement(componentThumb)
            .moveToElement(imageHolderCloseButton)
            .moveToElement(componentNameCloseButton)
            .moveToElement(canvas1)
            .release().perform();

    //WebElement xAxisClose = chrome.findElement(By.xpath("//*[@id=\"c358\"]"));
    //xAxisClose.clear();
    //xAxisClose.sendKeys("240");

    //WebElement yAxisClose = chrome.findElement(By.xpath("//*[@id=\"c359\"]"));
    //yAxisClose.clear();
    //yAxisClose.sendKeys("5");






    //Dragging the video component onto the canvas

    WebElement listContainerVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
    WebElement componentListVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
    WebElement videoComponent = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]"));
    WebElement componentThumbVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]/div[1]"));
    WebElement componentNameVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]/div[2]"));

    WebElement canvas2 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));

    actions.clickAndHold(videoComponent)
            .moveToElement(listContainerVideo)
            .moveToElement(componentListVideo)
            .moveToElement(componentThumbVideo)
            .moveToElement(componentNameVideo)
            .moveToElement(canvas2)
            .release().perform();


    chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);






    //Dragging the Text component onto the canvas

    WebElement listContainerText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
    WebElement componentListText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
    WebElement textComponent = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]"));
    WebElement componentThumbText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]/div[1]"));
    WebElement componentNameText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]/div[2]"));

    WebElement canvas3 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));

    actions.clickAndHold(textComponent)
            .moveToElement(listContainerText)
            .moveToElement(componentListText)
            .moveToElement(componentThumbText)
            .moveToElement(componentNameText)
            .moveToElement(canvas3)
            .release().perform();

stacktrace 中的可点击链接将我指向以下代码行:

 WebElement listContainer = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));

所以在测试之前能够点击Blank Project按钮。

根据我的调查,我可能会遇到一些同步问题,因为它是间歇性的。我是否需要包装 try/catch 异常而不是超时等待?还是我将它们放在代码中的错误位置?

任何人都可以帮助或建议我可能出错的地方吗?

【问题讨论】:

标签: selenium webdriver nosuchelementexception


【解决方案1】:

正如 Yuvaraj HK 所提到的,在您的代码中只使用一次隐式等待就足够了。它会隐式等待您尝试在代码中找到的每个元素。

chrome.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

但尽量保持隐式等待时间尽可能短,因为这可能会增加你的代码执行时间..

在某些情况下,元素可能需要超过 30 秒才能可见,在这种情况下可以使用显式等待。

WebDriverWait some_element = new WebDriverWait(driver,100); 
some_element.until(ExpectedConditions.visibilityOfElementLocated(By.id("id_of_some_element")));
//do anything you want with some_element

我强烈建议在 xpath 上使用 cssSelectorsThis article might help.
即使使用 xpath,也请尝试使用较短的路径。 使用 id 不是访问元素的唯一方法。它的父级可能具有唯一的类名或其他属性,您可以使用它们来创建高效的xpathscssSelectors

【讨论】:

  • 感谢您的 cmets。即使在将我的 xpath 构造函数转换为 cssSelectors 之后,我仍然收到相同的“没有这样的元素”错误。我认为问题在于不使用 try/catch 方法,因为当我调试并尝试跳过时,我在调试器中收到以下内容:ReflectiveCallable (org.junit.internal.runners.model),这似乎表明它需要一个可抛出的尝试/捕获。虽然我试图了解如何做到这一点。
  • 你确定你使用了正确的选择器,你能粘贴你的部分 html 代码和堆栈跟踪吗?
  • 这是可拖动元素的 HTML 代码 @Amith003 - 堆栈跟踪太大,无法在 cmets 中发布。 '
    • myfakewebsite.com/fakeimage.png" draggable="false">
      点击区域
    • '
  • 你可以随时编辑你的问题来粘贴代码......无论如何你可以试试这个cssSelector到达点击区域.....li.ui-draggable > div.f-feature-A
【解决方案2】:

我猜你的测试有时会因为以下陈述而失败

chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

只需在测试开始时放置一次超时代码,然后删除所有其他实例。

 chrome.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

【讨论】:

    【解决方案3】:

    您是否打开了一个新窗口?如果是,则需要制作驱动才能切换到新窗口,以下代码经我测试:

    String currentWindow = driver.getWindowHandle();// get handle of current window
    Set<String> handles = driver.getWindowHandles();// get handle of all windows
    Iterator<String> it = handles.iterator();
    while (it.hasNext()) {
    if (currentWindow == it.next()) {
    continue;
    }
    driver = driver.switchTo().window(it.next());// switch to new window
    
    //business action
    //xxxxxxx
    }
    driver.switchTo().window(currentWindow);//switch back to original window
    

    【讨论】:

    • 不,没有提到切换窗口。因为我会为您正在谈论的用例使用窗口句柄方法。
    【解决方案4】:

    好吧...所以我设法解决了这里发生的事情。当我使用 IntelliJ 时,似乎我需要告诉它调用每个方法的顺序。所以通过添加 @FixMethodOrder(MethodSorters.NAME_ASCENDING) 并在我的第一个方法上放置“a”,然后在第二个方法上放置“b”(我将粘贴在问题中的代码拆分为方法)等等,它按顺序运行这些方法,每个方法都有一个等待方法:

    try {
       Thread.sleep(10000);
    } catch (InterruptedException e) {
       e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    

    【讨论】:

      【解决方案5】:

      我在尝试在 Windows Server 2003 上测试 IE7 时遇到了同样的问题。我通过删除 Internet Explorer 增强安全配置来修复它。在 Server 2003 上,您可以通过执行以下操作来修复它:

      • 打开控制面板
      • 打开添加或删除程序
      • 打开添加/删除 Windows 组件(在左侧边栏上)
      • 取消选中 Internet Explorer 增强的安全配置
      • 点击下一步
      • 坚持到底
      • 重新启动 Internet Explorer

      如果使用 Server 2008 或 2012,步骤会有所不同,但目标是相同的。

      【讨论】:

        【解决方案6】:

        尝试使用SeleniumWait 库:

        SeleniumWait.withDriver(driver).withTimeOut(15).forElementToClick(element);
        

        【讨论】:

          【解决方案7】:

          可能是浏览器问题。我遇到了这个问题并尝试了各种措施来解决它,但直到浏览器的缩放百分比固定为 100% 才起作用。这可能听起来有点简单和有趣,但它对我有用。

          【讨论】:

            猜你喜欢
            相关资源
            最近更新 更多
            热门标签