Configuration
J'utilise Python 3.x et Selenium pour remplir un champ de requête et cliquer ensuite sur le bouton de recherche,
# element containing the product search bar and buttons
search_area = el_id('Products').find_element_by_class_name('searchArea')
# insert name of file to be duplicated
name_field = search_area.find_element_by_xpath("//input[@type='text']")
name_field.clear()
name_field.send_keys('to_be_duplicated')
# click search button
search_area.find_element_by_xpath('span/a[1]').click()
où el_id(x) = browser.find_element_by_id(x)
.
Problème
L'exécution du code ci-dessus donne l'erreur suivante,
ElementClickInterceptedException: Element <a class="button button-fleft searchButton" href="#"> is not clickable at point (577.6166763305664,225.06666564941406) because another element <div class="blockUI blockOverlay"> obscures it
Je peux résoudre cette erreur en insérant une dure attente avant de saisir et de cliquer sur le bouton, comme ça,
# click search button
time.sleep(1)
search_area.find_element_by_xpath('span/a[1]').click()
Mais je le résous plutôt différemment, alors j'ai suivi cette réponse et j'ai fait ce qui suit,
# click search button
search_button = search_area.find_element_by_xpath('span/a[1]')
WebDriverWait(driver, 10).until_not(EC.visibility_of_element_located((By.XPATH,
"//*[@id="Products"]/tbody/tr[1]/td/div/input")))
search_button.click()
Mais j'ai exactement la même erreur.
J'ai aussi essayé cette réponse , mais même erreur.
Comment résoudre ce problème?
Après le n ° 5 de réponse de DebanjanB , je l'ai résolu en impliquant le code d'attendre que la superposition temporaire disparaisse avant d'essayer de cliquer,
wait.until(EC.invisibility_of_element_located((By.XPATH,
"//div[@class='blockUI blockOverlay']")))
el_xp("//input[@value='Save']").click()
Il y a plusieurs façons de le faire, l'une d'elles est par exécuteur Javascript.
Tu pourrais dire:
element = driver.find_element_by_xpath("//div[@class='blockUI blockOverlay']")
driver.execute_script("arguments[0].style.visibility='hidden'", element)
De cette façon, vous pouvez bloquer la div avec class = 'blockUI blockOverlay'
et votre élément peut être cliqué si j'ai raison.