web-dev-qa-db-fra.com

Le sélénium ne peut pas cliquer sur l'élément car un autre élément le masque

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

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?

8
LucSpan

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()
4
LucSpan

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.

5
Anand