簡體   English   中英

Selenium IDE腳本在Selenium Webdriver中不起作用

[英]Selenium IDE script not working in Selenium Webdriver

我創建了一些Selenium IDE腳本,然后將這些腳本導出到Java / Junit4 webdriver支持的腳本中,並且僅導出了簡單的webdriver類。 當我運行這些類時,測試用例唯一要做的就是打開正確的URL。 之后,作為登錄測試用例的測試用例根本無法找到userName字段。 我嘗試通過名稱或id都可以工作。 我什至嘗試添加一些方法來等待頁面加載(實際上加載沒有問題); 我期望按名稱或ID部件至少可以工作,最后一個try塊使用我在網上找到的一種方法來繼續尋找userName字段,但是如果我解決了第一個try塊,則不需要surf。 我嘗試了一些在線資源,這些資源都在stackoverflow或其他論壇上,但有點令人困惑,因為來自IDE的簡單腳本無法輕松工作。

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package com.mycomp.selenium.uatseleniumsuite.test;

/**
*
* @author sar
*/


import com.mycomp.selenium.uatseleniumsuite.login.PaymentsTabWithCssTest;
import static junit.framework.Assert.assertEquals;
import java.util.concurrent.TimeUnit;

import java.io.File;
import java.io.IOException;
import static junit.framework.Assert.assertTrue;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;

public class TestloginSampleTest {

private String baseUrl;
private static WebDriver driver;
private ScreenshotHelper screenshotHelper;
static Logger logger = Logger.getLogger(TestloginSampleTest.class.getName());


@Before
public void openBrowser() {
baseUrl = "https://255.255.255.255:11115/myCompWebApp/login.go?siteLanguage=en&checked=true";
System.out.print("BASE URL IS  : "+baseUrl);
driver = new ChromeDriver();
driver.get(baseUrl);
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
screenshotHelper = new ScreenshotHelper();
}

@After
public void saveScreenshotAndCloseBrowser() throws IOException {
screenshotHelper.saveScreenshot("screenshot.png");
driver.quit();
}

@Test
public void UATLogin() throws IOException {
System.out.print("title : "+driver.getTitle());
assertEquals("The page title should equal mycomp at the start of the test.", "myCompOnline - Corporate", driver.getTitle());
try{
WebElement fuzoolPageCloseField = driver.findElement(By.id("splash-32856-close-button"));
System.out.print("fuzoolPageCloseField  : Found ");
fuzoolPageCloseField.click();
System.out.print("fuzoolPageCloseField  : Clicked ");
WebElement userNameField = driver.findElement(By.id("userName"));
System.out.print("userNameField  : Found ");
userNameField.sendKeys("myusername");
}catch( NoSuchElementException nse){
logger.error("EXCEPTION  by id: NoSuchElementException ");
System.out.print("EXCEPTION  by id: NoSuchElementException ");
nse.printStackTrace();
}catch(StaleElementReferenceException ser){
logger.error("EXCEPTION  : StaleElementReferenceException ");
System.out.print("EXCEPTION  : StaleElementReferenceException ");
ser.printStackTrace();

}


try{
WebElement userNameField = driver.findElement(By.name("userName"));
userNameField.sendKeys("myusername");
}catch( NoSuchElementException nse){
logger.error("EXCEPTION  By name : NoSuchElementException ");
System.out.print("EXCEPTION  BY name : NoSuchElementException ");
nse.printStackTrace();
}catch(StaleElementReferenceException ser){
logger.error("EXCEPTION  : StaleElementReferenceException ");
System.out.print("EXCEPTION  : StaleElementReferenceException ");
ser.printStackTrace();

}

try{
String myWindowHandle = driver.getWindowHandle();
driver.switchTo().window(myWindowHandle);
WebDriverWait wait = (WebDriverWait)new WebDriverWait(driver,10)
.ignoring(StaleElementReferenceException.class);
assertTrue("The page title should start with the search string after the search.",
(wait.until(new ExpectedCondition<Boolean>() { //last exception comes here for timeout
@Override 
public Boolean apply(WebDriver d) {
WebElement userNameField = driver.findElement(By.name("userName"));
userNameField.sendKeys("myusername");
return true;
}
})
));
}catch( NoSuchElementException nse){
logger.error("EXCEPTION after driver getwindowhandle : NoSuchElementException ");
System.out.print("EXCEPTION  : NoSuchElementException ");
nse.printStackTrace();
}catch(StaleElementReferenceException ser){
logger.error("EXCEPTION  : StaleElementReferenceException ");
System.out.print("EXCEPTION  : StaleElementReferenceException ");
ser.printStackTrace();

}



}

private class ScreenshotHelper {

public void saveScreenshot(String screenshotFileName) throws IOException {
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File(screenshotFileName));
}
}

public void waitForElementPresent(final By by, int timeout){ 
WebDriverWait wait = (WebDriverWait)new WebDriverWait(driver,timeout)
.ignoring(StaleElementReferenceException.class); 
wait.until(new org.openqa.selenium.support.ui.ExpectedCondition<Boolean>(){ 
@Override 
public Boolean apply(WebDriver webDriver) { 
WebElement element = webDriver.findElement(by); 
return element != null && element.isDisplayed(); 
} 
}); 
}
public static WebElement getElementByLocator( final By locator ) {
//  LOGGER.info( "Get element by locator: " + locator.toString() );  
final long startTime = System.currentTimeMillis();
Wait<WebDriver> wait = new FluentWait<WebDriver>( driver )
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring( StaleElementReferenceException.class ) ;
int tries = 0;
boolean found = false;
WebElement we = null;
while ( (System.currentTimeMillis() - startTime) < 91000 ) {
//   LOGGER.info( "Searching for element. Try number " + (tries++) ); 
try {
we = wait.until( ExpectedConditions.visibilityOfElementLocated( locator ) );
found = true;
break;
} catch ( StaleElementReferenceException e ) {      
//    LOGGER.info( "Stale element: \n" + e.getMessage() + "\n");
}
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
if ( found ) {
//   LOGGER.info("Found element after waiting for " + totalTime + " milliseconds." );
} else {
//   LOGGER.info( "Failed to find element after " + totalTime + " milliseconds." );
}
return we;
}


}

“ fuzoolPageCloseField”是一個加載並單擊腳本的窗口,它具有不同的名稱,但是我看到使用chrome defveloper工具時它具有不同的ID名稱,因此我在webdriver中使用它作為“ splash -something”原始名稱。在IDE中的運作方式。

堆棧跟蹤如下:

由於驅動程序超時,堆棧跟蹤在10秒間隔內帶有NoSuchElementException異常,最后一個異常在line 110(wait.until(new ExpectedCondition<Boolean>() {

cd C:\NetBeansProject\Selenium\testseleniumsuite; JAVA_HOME=D:\\Java\\jdk1.6.0_45 M2_HOME=D:\\APIs\\Maven\\Binary\\apache-maven-3.0.4 cmd /c "\"\"D:\\APIs\\Maven\\Binary\\apache-maven-3.0.4\\bin\\mvn.bat\" -Dtest=com.mycomp.selenium.testseleniumsuite.test.TestloginSampleTest -DnetbeansProjectMappings= -Dmaven.ext.class.path=\"D:\\Program Files\\NetBeans 7.4\\java\\maven-nblib\\netbeans-eventspy.jar\" surefire:test\"\""
Running NetBeans Compile On Save execution. Phase execution is skipped and output directories of dependency projects (with Compile on Save turned on) will be used instead of their jar artifacts.
Scanning for projects...

------------------------------------------------------------------------
Building testseleniumsuite 1.0-SNAPSHOT
------------------------------------------------------------------------

--- maven-surefire-plugin:2.10:test (default-cli) @ testseleniumsuite ---
Surefire report directory: C:\NetBeansProject\Selenium\testseleniumsuite\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mycomp.selenium.testseleniumsuite.test.TestloginSampleTest
BASE URL IS  : https://10.2.217.133:11115/myCompWebApp/login.go?siteLanguage=en&checked=trueStarting ChromeDriver (v2.8.241075) on port 21432
log4j:WARN No appenders could be found for logger (org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager).
log4j:WARN Please initialize the log4j system properly.
title : myCompOnline - CorporatefuzoolPageCloseField  : Found fuzoolPageCloseField  : Clicked    
  EXCEPTION  by id: NoSuchElementException org.openqa.selenium.NoSuchElementException: no such element
  (Session info: chrome=31.0.1650.63)
  (Driver info: chromedriver=2.8.241075,platform=Windows NT 6.1 SP1 x86) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 20.06 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.39.0', revision: '14fa800511cc5d66d426e08b0b2ab926c7ed7398', time: '2013-12-16 13:18:38'
System info: host: 'P5510041A', ip: '10.32.245.103', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_45'
Session ID: 62d2adad3c6cd4479b26a0f1fdab838e
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=C:\Users\5510041\AppData\Local\Temp\scoped_dir11832_12325}, rotatable=false, locationContextEnabled=true, version=31.0.1650.63, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:307)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:348)
    at org.openqa.selenium.By$ById.findElement(By.java:220)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:299)
    at com.mycomp.selenium.testseleniumsuite.test.TestloginSampleTest.UATLogin(TestloginSampleTest.java:75)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
EXCEPTION  BY name : NoSuchElementException org.openqa.selenium.NoSuchElementException: no such element
  (Session info: chrome=31.0.1650.63)
  (Driver info: chromedriver=2.8.241075,platform=Windows NT 6.1 SP1 x86) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 20.05 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.39.0', revision: '14fa800511cc5d66d426e08b0b2ab926c7ed7398', time: '2013-12-16 13:18:38'
System info: host: 'P5510041A', ip: '10.32.245.103', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_45'
Session ID: 62d2adad3c6cd4479b26a0f1fdab838e
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=C:\Users\5510041\AppData\Local\Temp\scoped_dir11832_12325}, rotatable=false, locationContextEnabled=true, version=31.0.1650.63, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:307)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByName(RemoteWebDriver.java:380)
    at org.openqa.selenium.By$ByName.findElement(By.java:305)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:299)
    at com.mycomp.selenium.testseleniumsuite.test.TestloginSampleTest.UATLogin(TestloginSampleTest.java:91)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 66.532 sec <<< FAILURE!

Results :

Tests in error: 
  UATLogin(com.mycomp.selenium.testseleniumsuite.test.TestloginSampleTest): Timed out after 10 seconds waiting for com.mycomp.selenium.testseleniumsuite.test.TestloginSampleTest$1@1e78fc6

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0

------------------------------------------------------------------------
BUILD FAILURE
------------------------------------------------------------------------
Total time: 1:07.488s
Finished at: Sun Dec 29 17:54:50 AST 2013
Final Memory: 4M/15M
------------------------------------------------------------------------
Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-cli) on project testseleniumsuite: There are test failures.

Please refer to C:\NetBeansProject\Selenium\testseleniumsuite\target\surefire-reports for the individual test results.
-> [Help 1]

To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.

For more information about the errors and possible solutions, please read the following articles:
[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

希望任何人都能提供幫助。

ps我還運行了webdriver支持的類,它們也都在同一點失敗了(通過webdriver支持,我的意思是您實例化一個硒對象並使用它來進行測試,但是甚至: selenium.click("id=splash-32856-close-button;");不起作用,至少此si在驅動程序對象中起作用)

提前致謝

在網絡瀏覽器中查看HTML,以查明其為何不起作用。 我懷疑您會發現ID發生了變化,這就是Selenium無法找到它們的原因-因為它們已經不存在了。

我解決了我的問題。 IDE中的腳本可以在IDE中正常工作,在Java / Junit中將其導出時,語句類似於

      driver.findElement(By.id("userName")).clear();
      driver.findElement(By.id("userName")).sendKeys("742817");

但是,我手動調試了它,並確保自己進入了它。 我認為我有一個iframe,這就是驅動程序無法看到該元素的原因。

因此,我搜索了iFrame並成功了。

  WebElement iframeWebelement = driver.findElement(By.xpath("//html/body/form/...../tbody/tr/td/iframe"));
   System.out.println("iframeWebelement : Found ");

  driver.switchTo().frame(iframeWebelement);
   WebElement userNameField = driver.findElement(By.id("userName"));
    System.out.println("userName  : Found ");
        userNameField.sendKeys("myusername");
            System.out.println("userName  : entered data ");

這對我有用。 我不知道iFrame是我需要切換到的東西。

希望這對使用iFrame的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM