Python Selenium checking checkbox: selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element

I have written code to select the checkbox at following website: https://www.theatlantic.com/do-not-sell-my-personal-information/

I have tried following versions: Version 1:

ele = driver.find_element_by_id('residency') driver.execute_script("arguments[0].click()",ele)

Version 2: checkBox1 = driver.find_element_by_css_selector("input[id='residency']")

Version 3: driver.find_element_by_xpath("//input[@type='checkbox']")

However, for all of these versions I get following error:

Traceback (most recent call last):
  File "website-functions/theatlantic.py", line 43, in <module>
    atlantic_DD_formfill(california_resident, email, zipcode)
  File "website-functions/theatlantic.py", line 30, in atlantic_DD_formfill
    driver.find_element_by_xpath("//input[@type='checkbox']")
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//input[@type='checkbox']"}      
  (Session info: headless chrome=80.0.3987.87)

Here you can see the full code:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import os
import time
def atlantic_DD_formfill(california_resident, email, zipcode):
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=chrome_options)
    driver.set_page_load_timeout(10)
    driver.set_window_size(1124, 850) # set browser size
    # link to data delete form
    print("opening data delete form")
    driver.get("https://www.theatlantic.com/do-not-sell-my-personal-information/")
    #Select California Resident Field:
    #ele = driver.find_element_by_id('residency') 
    #driver.execute_script("arguments[0].click()",ele)
    #checkBox1 = driver.find_element_by_css_selector("input[id='residency']")
    #if(NOT(checkBox1.isSelected())):
    #    checkBox1.click()
    driver.find_element_by_xpath("//input[@type='checkbox']")
    print("California Resident Field selected")
    driver.find_element_by_id("email").send_keys(email)
    driver.find_element_by_id("zip-code").send_keys(email) 
    # KEEP THIS DISABLED BC IT ACTUALLY SUBMITS 
    # driver.find_element_by_id("SubmitButton2").send_keys(Keys.ENTER)
    print("executed")
    time.sleep(4)
    driver.quit()
    return None
california_resident=True
email = "[email protected]"
zipcode=12345
atlantic_DD_formfill(california_resident, email, zipcode)

Upvotes: 0

Views: 371

Answers (1)

Sameer Arora
Sameer Arora

Reputation: 4507

There is an iframe present on the page, so you need to first switch to that iframe and then click on the element and as an another element is placed above the checkbox element, you need to use java script click method to click on the checkbox.
You can do it like:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import os
import time
def atlantic_DD_formfill(california_resident, email, zipcode):
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=chrome_options)
    driver.set_page_load_timeout(10)
    driver.set_window_size(1124, 850) # set browser size
    # link to data delete form
    print("opening data delete form")
    driver.get("https://www.theatlantic.com/do-not-sell-my-personal-information/")
    driver.switch_to.frame(driver.find_element_by_tag_name('iframe'))
    element = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//input[@type='checkbox']")))
    driver.execute_script("arguments[0].click();", element)

Upvotes: 1

Related Questions