2017-04-10 5 views
0

Web要素を初期化するために、セレンでPage Factoryモデルを使用しています。 Web要素を待機操作に渡している間に、コード内に待機操作があり、 "ClassCastException"がスローされます。 私は解決策を見つけることができません、すべてのリードは素晴らしいでしょう。 Page FactoryオブジェクトをWebElementオブジェクトにキャストする方法をいくつか教えてください。java.lang.ClassCastException:POMでPageFactoryを使用している場合のWeb-DriverWait

@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

要素とは何ですか? –

+0

'wait.until(ExpectedConditions.visibilityOfElementLocated((By)要素));' wait.until(ExpectedConditions.visibilityOf(element)); ' – kushal

+0

にお礼を書きます。それは助けになった。 –

答えて

1

それはすでにWebElementだときは、WebElementに変数categoriesをキャストしています。

変更この行は、この

waitClick(categories); 

waitClick((WebElement) categories); 

、それは例外を取り除く必要があります。

もう1つの問題は、waitClick()機能がWebElementByにキャストしていることです。そこにキャストは必要ありません。まだ、要素をクリックする前にクリック可能になるのを待つ必要があります。私は以下のように書き直すだろう。さらに、より

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

、セレンの作成者、サイモン・スチュワート、recommends not using Page Factory。代わりに、クラスの最上位にロケータを格納し、必要に応じてロケータを使用します。私はすべてを以下のように書き直すだろう。

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(); 
} 
関連する問題