Селен (Python) find_element_by_id не работает на schwab.com - PullRequest
1 голос
/ 02 марта 2020

Используя Selenium (через Python), я пытаюсь найти кнопку «Логин» для http://schwab.com. Кнопка является элементом типа BUTTON и id = 'loginSubmitButton'. Я использую следующий код:

from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://schwab.com")
driver.implicitly_wait(10)
driver.find_element_by_id("loginSubmitButton")
driver.close()

Браузер корректно открывает страницу и кнопка там находится под контролем (с помощью инструментов Chrome dev), однако Selenium не может ее найти.

Я перепробовал много вариантов этого кода, включая использование WebDriverWait, но, похоже, ничего не работает.

Предложения весьма приветствуются.

Ответы [ 3 ]

3 голосов
/ 02 марта 2020

Вы не можете нажать на эту кнопку, потому что форма входа ниже iFrame.

enter image description here

Итак, сначала вам нужно переключиться в iframe, затем только вы сможете получить доступ к этим элементам

username_frame = driver.find_element_by_id('LoginComponentForm')
driver.switch_to.frame(username_frame)
driver.find_element_by_id("loginSubmitButton").click()
1 голос
/ 02 марта 2020

Поскольку требуемый элемент находится в пределах <iframe>, поэтому для вызова click() на элементе необходимо:

  • Ввести WebDriverWait для требуемого рамка должна быть доступна и переключиться на нее .
  • Индуцировать WebDriverWait для желаемого элемента, который будет активным для клика .
  • Вы можно использовать любую из следующих стратегий локатора :

    • Использование CSS_SELECTOR:

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      driver = webdriver.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
      driver.get('https://www.schwab.com/')
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#LoginComponentForm")))
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span#LoginText"))).click()
      
    • Использование XPATH:

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      driver = webdriver.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
      driver.get('https://www.schwab.com/')
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='LoginComponentForm']")))
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@id='LoginText']"))).click()
      

Ссылка

Здесь вы можете найти соответствующую дискуссию по Способы работы с #document под iframe

0 голосов
/ 02 марта 2020

Использование find_element_by_xpath более эффективно, чем использование find_element_by_id. Вы можете попробовать использовать

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

Для переключения на iframe вы можете использовать следующий код:

драйвер. switch_to.frame (iframe)

Затем используйте здесь свой код нажатия кнопки.

Для возврата к содержимому по умолчанию используйте эту строку:

драйвер .switch_to.default_content ()

Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...