Python Флажок проверки Selenium: selenium.common.exceptions.NoSuchElementException: Сообщение: нет такого элемента: Невозможно найти элемент - PullRequest
0 голосов
/ 25 марта 2020

Я написал код для установки флажка на следующем веб-сайте: https://www.theatlantic.com/do-not-sell-my-personal-information/

Я пробовал следующие версии: Версия 1:

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

Версия 2: checkBox1 = driver.find_element_by_css_selector("input[id='residency']")

Версия 3: driver.find_element_by_xpath("//input[@type='checkbox']")

Однако для всех этих версий я получаю следующую ошибку:

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)

Здесь Вы можете увидеть полный код:

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 = "joe@musterman.com"
zipcode=12345
atlantic_DD_formfill(california_resident, email, zipcode)

1 Ответ

1 голос
/ 25 марта 2020

На странице присутствует iframe, поэтому вам нужно сначала переключиться на этот iframe, а затем щелкнуть элемент, и, поскольку над элементом флажка находится другой элемент, вам нужно использовать метод java script click, чтобы нажмите на флажок.
Вы можете сделать это следующим образом:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...