2016-08-30 1 views
0

Aktualisiert-Code initialisiert werden@FindBy WebElements nicht in einem PageFactory/Seite Objekt Rahmen

public class TestBase implements Config { 

public WebDriver driver; 
//a bunch of methods to handle Driver instantiation and kill 

//a bunch of Webdriver utility methods including: 
public void click(WebElement element) { 
    waitForIsDisplayed(element, 120); 
    element.click(); 
} 
public Boolean waitForIsDisplayed(WebElement element, Integer... timeout) { 
    try { 
     waitFor(ExpectedConditions.visibilityOf(element), 
       (timeout.length > 0 ? timeout[0] : null)); 
    } catch (org.openqa.selenium.TimeoutException exception) { 
     return false; 
    } 
    return true; 
} 

private void waitFor(ExpectedCondition<WebElement> condition, Integer timeout) { 
    timeout = timeout != null ? timeout : 5; 
    WebDriverWait wait = new WebDriverWait(driver, timeout); 
    wait.until(condition); //java.lang.reflect.UndeclaredThrowableException HERE...Caused by NoSuchElementException 
} 

Sieht so aus, als ob das Framework nicht auf die erwarteten Bedingungen wartet - Sichtbarkeit von Element. Ich vermute, dass etwas mit der Umsetzung zu tun 'visibilityOf (Element)' und die Art und Weise der @FindBy die Elemente

Stack-Trace Ausnahme initialisiert:

java.lang.reflect.UndeclaredThrowableException 
at com.sun.proxy.$Proxy7.findElement(Unknown Source) 
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69) 
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38) 
at com.sun.proxy.$Proxy9.isDisplayed(Unknown Source) 
at org.openqa.selenium.support.ui.ExpectedConditions.elementIfVisible(ExpectedConditions.java:302) 
at org.openqa.selenium.support.ui.ExpectedConditions.access$100(ExpectedConditions.java:41) 
at org.openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:288) 
at org.openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:285) 
at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:238) 
at com.multicom.fabrix.framework.TestBase.waitFor(TestBase.java:152) 
at com.multicom.fabrix.framework.TestBase.waitForIsDisplayed(TestBase.java:141) 
at com.multicom.fabrix.pageobjects.CustomerHomePage.waitForResults(CustomerHomePage.java:75) 
at com.multicom.fabrix.regressiontests.FlightBookingTest.searchForAPackage(FlightBookingTest.java:23) 
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:86) 
at org.testng.internal.Invoker.invokeMethod(Invoker.java:643) 
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820) 
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128) 
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) 
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) 
at org.testng.TestRunner.privateRun(TestRunner.java:782) 
at org.testng.TestRunner.run(TestRunner.java:632) 
at org.testng.SuiteRunner.runTest(SuiteRunner.java:366) 
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361) 
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) 
at org.testng.SuiteRunner.run(SuiteRunner.java:268) 
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244) 
at org.testng.TestNG.runSuitesLocally(TestNG.java:1169) 
at org.testng.TestNG.run(TestNG.java:1064) 
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:74) 
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:121) 
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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Caused by: java.lang.reflect.InvocationTargetException 
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 com.mycompany.mymodule.webdriver.WebDriverInvoker.invokeNormally(WebDriverInvoker.java:47) 
at com.mycompany.mymodule.webdriver.WebDriverInvoker.invoke(WebDriverInvoker.java:38) 
... 41 more 

Verursacht durch: org.openqa.selenium.NoSuchElementException : kein solches Element: Element kann nicht gefunden werden: {"method": "xpath", "selector": ".//*[@ id = 'container']/div/div [3]/div/div [1]/div/h3 "}

Antwort

1

Wechseln Sie Ihre PageBase-Klasse nach unten. Sie haben zuvor die Proxies initialisiert, aber diese Instanz nicht zurückgegeben, sondern nur ein neues Objekt. Sonst kann man die initElements Linie im Konstruktor von CustomerHomePage Stick 'this' anstelle des 'CustomerHomePage.class'

public class PageBase extends SeleniumBase { 

public CustomerHomePage customerHomePage() 
{ 
    return PageFactory.initElements(driver, CustomerHomePage.class); 
} 
+0

Danke. Works wie erklärt – Steerpike

+0

, was ich nicht wirklich in diesem Stadium zu verstehen ist, warum alle Methoden, die jetzt die FindBy verwenden mit NoSuchElementExceptions bombardieren. Wenn ich mit Haltepunkten debugge, läuft der Test gut. Es gibt also ein Synchronisierungsproblem mit FindBy's. Ist es der Fall, dass initElements versucht, die Locators zu finden, bevor der WebDriver zur relevanten Seite oder zum Seitenbereich gefahren ist? Wie im Test, verweise ich auf mehrere verschiedene PageObjects, so dass einige der FindBy versuchen können, zu initialisieren, bevor die Seite geladen wurde? – Steerpike

+0

Es spielt keine Rolle, wo Sie die PageObjects initialisieren, da PageFactory.initElements nur Proxys für die mit @FindBy-Annotation markierten WebElement-Felder bereitstellt. Wenn Sie jedoch auf diese Felder zugreifen, müssen Sie für Methoden wie sendkeys oder click sicherstellen, dass sich der Browser auf der richtigen Seite befindet. Sie können die aktuelle URL mit der für das PageObject gewünschten Seite vergleichen oder sich die LoadableComponent-Klasse ansehen. Wenn Sie NoSuchElementExceptions erhalten, die im Debug-Modus verschwinden, müssen Sie die WebDriverWait- und ExpectedConditions-Klasse verwenden, um ordnungsgemäß zu synchronisieren. – Grasshopper

0

Variablennamen in Ihrem @FindBy ist drioDownLocator und ein Sie vorbei dropDownContainer ist. Gibt es noch eine andere Variable mit WebElement Typ in Ihrer Klasse?

Verwandte Themen