2014-10-07 13 views

Odpowiedz

7

Wygląda na to, że nie ma warunku odpowiadającego selenium.webdriver.support.expected_conditions.element_to_be_clickable w języku Python. Jednak patrząc na źródło tego warunku, widzę, że robi on dwie kontrole:

  1. To element jest widoczny.

  2. Włączenie tej opcji.

Można więc poczekać, aż oba warunki staną się prawdziwe. Poniższy kod ilustruje, jak można to zrobić. Najpierw powoduje, że element jest niewidoczny i wyłącza go, ustawia pewne limity czasowe, aby był widoczny i mógł go włączyć, a następnie czekał, aż wystąpią dwa warunki.

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

Kod może wydawać się nieco dziwny ze względu na fakt, że pracujemy z obietnicami. Nie, że obietnice są z natury dziwne, ale wymagają trochę czasu, aby się przyzwyczaić, gdy jeden jest używany do pracy z Pythonem.

+0

Chłodny, aby sprawdzić zachowanie na API Pythona! Jeśli tak jest, problem rozwiązany! : D –

+0

TO jest wyjaśnienie, którego szukałem przez miesiąc! Użyłem '.isEnabled()' i wykonałem 100 testów i wszystkie przeszły, podczas gdy wcześniej było na poziomie 90%. Mam nadzieję, że inni znajdą tę odpowiedź. Dziękuję bardzo @Louis –

2

Jeśli nie dbają o kliknięcie obiektu raz jest ona dostępna ** następnie można zrobić coś takiego:

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

** jeśli tylko chcą sprawdzić, czy element jest klikalny bez konieczności klikania go to ten fragment nie jest dla Ciebie. W takim przypadku powiedziałbym, że webdriver js nie zapewnia środków do tego. (lub przynajmniej jeszcze go nie znalazłem, mile widziane wglądy :))

Powiązane problemy