0

J'ai un code dire Sélénium attendre jusqu'à ce qu'un élément est cliquable, mais pour une raison quelconque, Sélénium ne marche pas attendre, mais au contraire, cliquez sur cet élément et élever une non cliquable au point (x, y) immédiatement. Une idée de comment résoudre ce problème?Sélénium explicite attente ne marche pas le travail

x = '//*[@id="arrow-r"]/i' 
driver = webdriver.Chrome(path) 
driver.get('https://www.inc.com/inc5000/list/2017') 
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, x))) 
driver.find_element_by_xpath(x).click() 
+0

Quelle est la classe CE? – cezarypiatek

+0

@cezarypiatek conditions prévues –

+0

de contrôle EC.element_to_be_clickable si l'élément est visible et activé. En termes de visibilité, il ne couvre pas le scénario lorsque l'élément est derrière l'autre. Peut-être que votre page utilise quelque chose comme un widget blockUI et que le clic() se produit avant que la couverture ne disparaisse. – cezarypiatek

Répondre

0

Voici un lien vers la section 'attente' pour les docs Python Sélénium: Click here

Wait sera comme:

element = WebDriverWait(driver, 10).until(
    EC.visibility_of((By.XPATH, "Your xpath")) 
) 
element.click(); 
+0

Ça ne marcherait toujours pas. –

+0

quelle erreur obtenez-vous maintenant? – zsbappa

+0

encore l'élément non clicable au point –

1

contrôle EC.element_to_be_clickable si l'élément est visible et activé . En termes de visibilité, il ne couvre pas le scénario lorsque l'élément est derrière l'autre. Peut-être que votre page utilise quelque chose comme un widget blockUI et que le clic() se produit avant que la couverture ne disparaisse. Vous pouvez vérifier si l'élément est vraiment cliquable en enrichissant EC.element_to_be_clickable ((By.XPATH, x)) vérifier avec l'assertion que l'élément n'est pas derrière par les autres. Dans mes projets, j'utilise la mise en œuvre comme ci-dessous:

static bool IsElementClickable(this RemoteWebDriver driver, IWebElement element) 
{ 
    return (bool)driver.ExecuteScript(@" 
      (function(element){ 
       var rec = element.getBoundingClientRect(); 
       var elementAtPosition = document.elementFromPoint(rec.left+rec.width/2, rec.top+rec.height/2); 
       return element == elementAtPosition || element.contains(elementAtPosition); 
      })(arguments[0]); 
    ", element); 
} 

Ce code est en C#, mais je suis sûr que vous pouvez facilement traduire dans votre langage de programmation de choix.

MISE À JOUR: J'ai écrit un blog sur les problèmes liés à cliquer avec le cadre de sélénium https://cezarypiatek.github.io/post/why-click-with-selenium-so-hard/