Home > Back-end >  Selenium can't find the div element to click
Selenium can't find the div element to click

Time:11-05

I'm using selenium to automate some tasks with webdriver.

Turns out I can't find a div to click on, selenium just can't find it.

Does anyone have a suggestion?

HTML :

<div aria-controls="leftAdvPnl_body" aria-expanded="false" aria-haspopup="true" class="rich-stglpanel-header " id="leftAdvPnl_header" onclick="SimpleTogglePanelManager.toggleOnClient(event,'leftAdvPnl');" onkeypress="return keypressclickhandle(event);" role="link" tabindex="0"><div aria-hidden="true" class="rich-stglpanel-marker"><div class="rich-stglpnl-marker" aria-hidden="true" id="leftAdvPnl_switch_on" style="display: none">«</div><div class="rich-stglpnl-marker" aria-hidden="true" id="leftAdvPnl_switch_off">»</div></div><span id="leftAdvPnl_header_label">Pesquisar</span><span aria-hidden="true">&nbsp;</span></div>

Code phyton:

while len(navegador.find_elements_by_xpath('//*[@id="leftAdvPnl_header"]')) < 1:
    time.sleep(1)
    print("Procurando formulário do processo")

link=navegador.find_element_by_xpath("//*[@id="leftAdvPnl_header"]")
link.click()

Thanks!

CodePudding user response:

You have 2 nested double quotes, instead of "//*[@id="leftAdvPnl_header"]" use '//*[@id="leftAdvPnl_header"]'

CodePudding user response:

You need to wait for an element to be clickable, so try:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="leftAdvPnl_header"]'))).click()

CodePudding user response:

Please check in the dev tools (Google chrome) if we have unique entry in HTML DOM or not.

xpath that you should check :

//div[@id='leftAdvPnl_header']

Steps to check:

Press F12 in Chrome -> go to element section -> do a CTRL F -> then paste the xpath and see, if your desired element is getting highlighted with 1/1 matching node.

If we have 1/1 matching node, Please make sure that :

  1. This div is not under an iframe.
  2. This div is not under a shadow-root.
  3. You should not be on new tab/windows launched by selenium.

Code :

try:
    WebDriverWait(navegador, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='leftAdvPnl_header']"))).click()
    print("Clicked on web element")
except:
    pass

Imports :

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

CodePudding user response:

To click on the element with text as Pesquisar you can use either of the following Locator Strategies:

  • Using css_selector:

    driver.find_element(By.CSS_SELECTOR, "div.rich-stglpanel-header#leftAdvPnl_header span#leftAdvPnl_header_label").click()
    
  • Using xpath:

    driver.find_element(By.XPATH, "//span[text()='Pesquisar' and @id='leftAdvPnl_header_label']").click()
    

Ideally, to click on the element you need to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following Locator Strategies:

  • Using CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.rich-stglpanel-header#leftAdvPnl_header span#leftAdvPnl_header_label"))).click()
    
  • Using XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Pesquisar' and @id='leftAdvPnl_header_label']"))).click()
    
  • Note: You have to add the following imports :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Related