2014-10-07 16 views
5

Qualcuno sa come aspettare che un WebElement sia selezionabile in WebDriverJS? So già come aspettare che l'elemento sia "visibile", ma avrei bisogno che fosse "cliccabile" .. Qualcosa di simile a expectable conditions in collegamento Python. Non sono stato in grado di trovare qualcosa di simile in Webdriver Js API.Come posso attendere che un elemento sia selezionabile in WebDriverJS?

+0

Non penso che le "condizioni previste" siano presenti nel webdriver js. –

risposta

7

Non sembra esserci una condizione equivalente a selenium.webdriver.support.expected_conditions.element_to_be_clickable di Python. Tuttavia, osservando la fonte per tale condizione, vedo che esegue due controlli:

  1. Che l'elemento sia visibile.

  2. Che sia abilitato.

Quindi è possibile attendere che entrambe le condizioni diventino vere. Il seguente codice illustra come ciò potrebbe essere fatto. Prima rende invisibile un elemento e lo disabilita, imposta alcuni timeout per renderlo visibile e abilitarlo, quindi attendi che le due condizioni si verifichino.

var webdriver = require('selenium-webdriver'); 

var driver = new webdriver.Builder(). 
    withCapabilities(webdriver.Capabilities.chrome()). 
    build(); 

driver.get('http://www.google.com'); 

// This script allows testing the wait. We make the element invisible 
// and disable it and then set timeouts to make it visible and enabled. 
driver.executeScript("\ 
var q = document.getElementsByName('q')[0];\ 
q.style.display = 'none';\ 
q.disabled = true;\ 
setTimeout(function() {\ 
    q.style.display = '';\ 
}, 2000);\ 
setTimeout(function() {\ 
    q.disabled = false;\ 
}, 3000);\ 
"); 
driver.findElement(webdriver.By.name('q')).then(function (element) { 
    driver.wait(function() { 
     return element.isDisplayed().then(function (displayed) { 
      if (!displayed) 
       return false; 

      return element.isEnabled(); 
     }); 
    }); 
    element.sendKeys('webdriver'); 
}); 
driver.findElement(webdriver.By.name('btnG')).click(); 
driver.wait(function() { 
return driver.getTitle().then(function(title) { 
    return title === 'webdriver - Google Search'; 
}); 
}, 1000); 

driver.quit(); 

Il codice potrebbe sembrare un po 'strano a causa del fatto che stiamo lavorando con promesse. Non che le promesse siano intrinsecamente strane ma ci vuole un po 'di tempo per abituarsi a quando si è abituati a lavorare con Python.

+0

Fantastico che controlli il comportamento sull'API di python! Se questo è il caso, il problema è risolto! : D –

+0

QUESTA è la spiegazione che stavo cercando da un mese! Ho usato '.isEnabled()' e ho eseguito 100 test e tutti sono passati, mentre prima era al tasso di passaggio del 90%. Spero che gli altri trovino questa risposta. Grazie mille @Louis –

2

Se non si cura di clic sull'oggetto una volta che è disponibile ** allora si può fare qualcosa di simile:

function clickWhenClickable(locator, timeout){ 
    driver.wait(function(){ 
    return driver.findElement(locator).then(function(element){ 
     return element.click().then(function(){ 
     return true; 
     }, function(err){ 
     return false; 
     }) 
    }, function(err){ 
     return false; 
    }); 
    }, timeout, 'Timeout waiting for ' + locator.value); ; 
} 

** se si solo vuole verificare se l'elemento è cliccabile senza doverlo fare clic su quindi questo frammento non fa per te. In tal caso, direi che il webdriver js non fornisce i mezzi per farlo. (o almeno non l'ho ancora trovato, intuizioni benvenute :))

Problemi correlati