Search code examples
pythonseleniumxpathcss-selectorsframe

document.querySelector( ).click(); not working selenium $0.click(); undefined


I am trying to click a button with selenium. I have tried Chrome and Firefox console with $0.click(); and works but when testing with the selector it does not work, "undefined", document.querySelector("#td").click();.

I trying with selenium does not work.

HTML:

<td id="td" onclick="if(top.body) Len('td')" class="lenDesActiv">Date</td>

I tried the following:

driver.execute_script('document.querySelector("td#tdDos.lenguetaActiva").click();')
driver.execute_script('document.querySelector("td#").click();')
driver.execute_script('document.querySelector("#td").click();')
driver.execute_script('document.querySelector("td#td").click();')
driver.execute_script('document.getElementById("td").click();')
driver.findElement(By.id("td")).click();
document.getElementById("td").addEventListener("click", function(){
    alert("hello world");
});

loginelement = driver.find_element(By.ID, 'td')
driver.execute_script("arguments[0].click();", loginelement)

Solution

  • The WebElement with text as Fecha is within a <frame> so you have to:

    • Induce WebDriverWait for the desired frame to be available and switch to it.

    • Induce WebDriverWait for the desired element to be clickable.

    • You can use either of the following Locator Strategies:

    • Using CSS_SELECTOR:

      driver.get('https://your_website.com/')
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='body']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "td#tdDos.lenguetaDesActiva"))).click()
      
    • Using XPATH:

      driver.get('https://your_website.com/')
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='body']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//td[@id='tdDos' and @class='lenguetaDesActiva']"))).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
      
    • Browser Snapshot:

    Fecha


    Reference

    You can find a couple of relevant discussions in: