2017-10-17 14 views
-1

WebDriver n'attend pas que les éléments soient activés ou affichés dans mon application Web. L'application web utilise largement AJAX/Javascript pour charger une très grande application dynamique, en particulier l'éditeur d'application Web de Bubble (https://bubble.is). Je développe des applications en utilisant des bulles et je veux utiliser Selenium/WebDriver depuis l'éditeur Bubble.WebDriver ne fonctionne pas sur FindElement

Lorsque vous utilisez attend implicites, attend explicites et attend couramment, tente de cliquer sur un élément toujours renvoyer l'erreur suivante:

org.openqa.selenium.WebDriverException: unknown error: Element <div class="tab tabs-3">...</div> is not clickable at point (30, 185). Other element would receive the click: <div class="status-notification" style="display: block;">...</div> 

Ce problème semble être lié à des éléments apparaissant dans les DOM avant qu'ils ne soient pleinement chargé. Le code suivant Java est ce qui est utilisé ici, compilé et exécuté dans Eclipse IDE Java 9: ​​

public static void main(String[] args) { 
     try { 
     WebDriver chrome = bubbleLogin(false); // login to application via static page. this step works 
     WebDriver driver = chrome; 
    // load app 
     WebDriverWait wait = new WebDriverWait(driver, DEFAULT_TIMEOUT_IN_SECONDS); 


     driver.get("https://bubble.is/page?type=page&name=index&id=test123456code&tab=tabs-1"); 
     switchToWindowWithTitle("test123456", driver); 

//  EXPLICIT WAIT: wait for "elementToBeClickable" to be true - element must be displayed and enabled 
     wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.tab.tabs-3"))); 
//  FLUENT WAIT: wait for element.IsEnabled to be true - element must be displayed and enabled 
// instantiate an instance of this class to run the wait function I wrote 
     testng test = new testng(); 
     test.waitUntilElementExistsAndIsEnabled(driver,By.cssSelector("div.tab.tabs-3")); 

//  only works via sleep... not implicit, explicit or fluent waits 

//  Thread.sleep(10000); 
     driver.findElement(By.cssSelector("div.tab.tabs-3")).click(); 

    } catch (Exception e) { 
     System.out.println("failed run"); 
     e.printStackTrace(); 
    } 
    } 
} 

Et la méthode FluentWait ci-dessus:

private void waitUntilElementExistsAndIsEnabled(WebDriver driver, final By by) { 
     new FluentWait<WebDriver>(driver).withTimeout(DEFAULT_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS) 
      .pollingEvery(DEFAULT_SLEEP_TIME_IN_SECONDS, TimeUnit.SECONDS).ignoring(NoSuchElementException.class) 
      .until(new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver wd) { 
       return wd.findElement(by).isEnabled(); 
      } 
      }); 
    } 

Voici une décharge complète du message d'erreur d'Eclipse: (info session: chrome = 61.0.3163.100)

(Driver info: chromedriver=2.32.498537 (cb2f855cbc7b82e20387eaf9a43f6b99b6105061),platform=Mac OS X 10.12.1 x86_64) (WARNING: The server did not provide any stacktrace information) 

Command duration or timeout: 0 milliseconds 

Build info: version: '3.6.0', revision: '6fbf3ec767', time: '2017-09-27T16:15:26.402Z' 

System info: host: 'Krystals-MacBook-Air.local', ip: 'fe80:0:0:0:c33:4430:fcfd:933c%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.1', java.version: '9' 

Driver info: org.openqa.selenium.chrome.ChromeDriver 

Capabilities [{mobileEmulationEnabled=false, hasTouchScreen=false, platform=MAC, acceptSslCerts=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, platformName=MAC, setWindowRect=true, unexpectedAlertBehaviour=, applicationCacheEnabled=false, rotatable=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.32.498537 (cb2f855cbc7b82e20387eaf9a43f6b99b6105061), userDataDir=/var/folders/gr/lggvp4hn09x2zqg6k561y4fr0000gn/T/.org.chromium.Chromium.haqAAG}, takesHeapSnapshot=true, pageLoadStrategy=normal, unhandledPromptBehavior=, databaseEnabled=false, handlesAlerts=true, version=61.0.3163.100, browserConnectionEnabled=false, nativeEvents=true, locationContextEnabled=true, cssSelectorsEnabled=true}] 

Session ID: 0c9110334bb1b20a306363006f4bb868 

at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) 
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214) 
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166) 
at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40) 
at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:82) 
at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:45) 
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164) 
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83) 
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:586) 
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:279) 
at    org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:83) 
at testng.main(testng.java:497) 
+0

at vous avez lu le message d'exception? Ça dit quoi? – JeffC

+1

Pour l'erreur 'Element n'est pas cliquable au point (x, y)' voir ce QA/Discussion [Selenium Web Driver & Java. L'élément n'est pas cliquable au point (36, 72). Autre élément recevrait le clic:] (https://stackoverflow.com/questions/44912203/selenium-web-driver-java-element-is-not-clickable-at-point-36-72-other-el) – DebanjanB

+0

@DebanjanB Merci pour la réponse, j'essaierai d'utiliser la classe actions pour que le clic fonctionne avec des attentes explicites. – andersan

Répondre

-1

i utilisé

  1. Thread.sleep avant que je clique sur l'élément puis
  2. je trouverai l'élément parent avant que je clique sur l'élément principal

ou

(new WebDriverWait(driver, 10)).until(ExpectedConditions.visibilityOfElementLocated(By.linkText("Reset"))); 
boolean Sort = driver.findElement(By.linkText("Reset")).isDisplayed(); 
if (Sort == true){ 
}else{ 
} 

espérons qu'il fonctionne

+0

Merci! Je voudrais éviter toute utilisation de thread.sleep (X) si possible, car une attente dynamique qui attend que certaines conditions soient vraies serait beaucoup plus efficace. L'attente explicite ressemble à ce que j'ai essayé - je vais essayer de trouver l'élément parent en premier si l'utilisation des fonctions Actions n'aide pas cela. – andersan