web-dev-qa-db-ja.com

org.openqa.Selenium.NoSuchElementException:そのような要素はありません

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();

スタックトレースのクリック可能なリンクは、次のコード行を示しています。

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

したがって、テストの前にBlank Projectボタン。

調査したところ、断続的に同期の問題が発生しているようです。タイムアウト待機ではなく、try/catch例外をラップする必要がありますか?または、これらをコードの間違った場所に配置していますか?

誰かが私が間違っているかもしれない場所を助けたり提案したりできますか?

6
Django_Tester

Yuvaraj HKが言及したように、コード内で暗黙の待機を1回だけ使用するだけで十分です。コード内でfindを試行するすべての要素を暗黙的に待機します。

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ではなく cssSelectors を使用することを強くお勧めします。 この記事が役立つ場合があります
xpathが使用されている場合でも、短いものを使用してみてください。 要素に到達する唯一の方法は、idの使用ではありません。その親には、効率的なxpathsまたはcssSelectorsを作成するために使用できる一意のクラス名または他の属性がある場合があります。

6
Amith

以下の文が原因でテストが失敗することがあります

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

テストの開始時にタイムアウトコードを1回だけ配置し、他のすべてのインスタンスを削除します。

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

Windows Server 2003でIE7をテストしようとしたときにも同じ問題が発生しました。InternetExplorerのセキュリティ強化の構成を削除して修正しました。 Server 2003では、次のようにして修正できます。

  • コントロールパネルを開く
  • [プログラムの追加と削除]を開く
  • Windowsコンポーネントの追加と削除(左側のサイドバー)を開きます。
  • Internet Explorerセキュリティ強化の構成のチェックを外します
  • 次へをクリック
  • 最後までフォロー
  • Internet Explorerを再起動します

Server 2008または2012を使用している場合、手順は異なりますが、目標は同じです。

1
James Watkins

新しいウィンドウを開きましたか?はいの場合、新しいウィンドウに切り替えるにはmakeドライバーが必要です。次のコードが私によってテストされます。

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
1
Timothy.Li

右...そこで何が起こったのかをなんとか解決しました。 IntelliJを使用しているため、各メソッドを呼び出す順序を指示する必要があるようです。したがって、@FixMethodOrder(MethodSorters.NAME_ASCENDING)を追加して最初のメソッドに「a」を配置し、次に2番目のメソッドに「b」を配置することで(質問に貼り付けたコードを以降のメソッドに分割します)など、メソッドを実行しました各メソッドで待機する順序:try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. }

1
Django_Tester

ブラウザの問題である可能性があります。私はこの問題を抱えており、それを修正するためにあらゆる手段を試みましたが、ブラウザーのズーム率が100%に修正されるまで機能しませんでした。これは少しシンプルで面白いように聞こえるかもしれませんが、私にとってはうまくいきました。

0
Blazijaz

使用してみてください SeleniumWait ライブラリ:

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