2017-04-10 3 views
0

benutze Ich benutze Page Factory-Modell in Selen, um die Web-Elemente zu initialisieren. Ich habe Operationen in meinem Code warten, während das Web-Element zu meinen Warteoperationen übergeben, es wirft "ClassCastException". Ich bin nicht in der Lage, eine Lösung zu finden, alle Leads werden großartig. Bitte schlagen Sie mir einige Möglichkeiten vor, um das Objekt 'Objekt zu WebElement' der Page Factory zu konvertieren.java.lang.ClassCastException: In Web-DriverWait, wenn ich PageFactory mit POM

@FindBy(how = How.XPATH, using = "//*[@id='menu-posts']/div[3]/div/ul/li[3]/a") public WebElement categories;

public void menus() { 
      try { 
       loginTest(); 
       menuPosts.click(); 
       waitClick((WebElement) categories); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       driver.quit(); 
      } 
     } 
    public void waitClick(WebElement element) { 
     WebDriverWait wait = new WebDriverWait(driver, 20); 
     wait.until(ExpectedConditions.visibilityOfElementLocated((By) element)); 
     element.click(); 
    } 


**Exception trace:** 

    java.lang.ClassCastException: com.sun.proxy.$Proxy7 cannot be cast to org.openqa.selenium.By 
     at com.pageObject.categories.waitClick(categories.java:75) 
     at com.pageObject.categories.menus(categories.java:54) 
     at SeleniumFramework.com.framework.AppTest.viewPost(AppTest.java:37) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108) 
     at org.testng.internal.Invoker.invokeMethod(Invoker.java:661) 
     at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869) 
     at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193) 
     at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126) 
     at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 
     at org.testng.TestRunner.privateRun(TestRunner.java:744) 
     at org.testng.TestRunner.run(TestRunner.java:602) 
     at org.testng.SuiteRunner.runTest(SuiteRunner.java:380) 
     at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375) 
     at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340) 
     at org.testng.SuiteRunner.run(SuiteRunner.java:289) 
     at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
     at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
     at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301) 
     at org.testng.TestNG.runSuitesLocally(TestNG.java:1226) 
     at org.testng.TestNG.runSuites(TestNG.java:1144) 
     at org.testng.TestNG.run(TestNG.java:1115) 
     at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132) 
     at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:236) 
     at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:81) 
+0

Was ist Element? –

+0

Sie müssen 'wait.until (ExpectedConditions.visibilityOfElementLocated ((By) -Element));' zu 'wait.until (ExpectedConditions.visibilityOf (element));' – kushal

+0

Vielen Dank. Es half. –

Antwort

1

Sie die Variable categories zu einem WebElement Gießen, wenn es bereits ein WebElement.

Ändern Sie diese Zeile

waitClick((WebElement) categories); 

dieser

waitClick(categories); 

und es sollte die Ausnahme loszuwerden.

Ein weiteres Problem, mit dem Sie konfrontiert werden, ist, dass Ihre waitClick() Funktion eine WebElement in eine By wirft. Du brauchst die Besetzung dort nicht. Besser noch, Sie sollten darauf warten, dass das Element anklickbar ist, bevor Sie darauf klicken. Ich würde es wie folgt umschreiben.

public void waitClick(WebElement element) 
{ 
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(element)).click(); 
} 

Weiter mehr, der Schöpfer von Selen, Simon Stewart, recommends not using Page Factory. Ich würde stattdessen Locators an der Spitze der Klasse speichern und sie dann bei Bedarf verwenden. Ich würde das Ganze wie folgt umschreiben.

public By categoriesLocator = By.xpath("//*[@id='menu-posts']/div[3]/div/ul/li[3]/a"); 

public void menus() 
{ 
    try 
    { 
     loginTest(); 
     menuPosts.click(); // why aren't you using waitClick() here? 
     waitClick(categoriesLocator); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     driver.quit(); 
    } 
} 

public void waitClick(By locator) 
{ 
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(locator)).click(); 
} 
Verwandte Themen