2017-04-10 3 views
0

J'utilise le modèle d'usine Page en sélénium pour initialiser les éléments Web. J'ai des opérations d'attente dans mon code, en passant l'élément web à mes opérations d'attente, il lance "ClassCastException". Je ne suis pas en mesure de trouver une solution, toutes les pistes seront géniales. Veuillez me suggérer des moyens de convertir l'objet 'Objet en WebElement' de la Page Factory.java.lang.ClassCastException: Dans Web-DriverWait lors de l'utilisation de PageFactory avec 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

Qu'est-ce qu'un élément? –

+0

Vous devez changer 'wait.until (ExpectedConditions.visibilityOfElementLocated ((By) élément));' à 'wait.until (ExpectedConditions.visibilityOf (element));' – kushal

+0

Merci beaucoup. Ça m'a aidé. –

Répondre

1

Vous jettes la variable categories à un WebElement quand il est déjà un WebElement.

Modifier cette ligne

waitClick((WebElement) categories); 

à cette

waitClick(categories); 

et il devrait se débarrasser de l'exception.

Un autre problème que vous allez rencontrer est que votre fonction waitClick() est en train de transformer un WebElement en un By. Vous n'avez pas besoin de la distribution là-bas. Mieux encore, vous devriez attendre que l'élément soit cliquable avant de cliquer dessus. Je le réécrirais comme ci-dessous.

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

De plus, le créateur de Sélénium, Simon Stewart, recommends not using Page Factory. Je voudrais plutôt stocker les localisateurs au sommet de la classe et ensuite les utiliser, au besoin. Je réécrirais le tout comme ci-dessous.

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