Невозможно получить доступ к текстовому полю и кнопке на определенном веб-сайте с помощью Selenium WebDriver и Python - PullRequest
0 голосов
/ 17 марта 2019

Я делаю первые шаги в селене и сейчас сталкиваюсь со странной проблемой. Я хочу перейти на веб-сайт и ввести текст в поле поиска, а также нажать кнопку «Ввод», чтобы перейти на следующую страницу. В общем, я знаю, как это сделать, и это работает без проблем на других сайтах, но этот, кажется, вызывает проблемы. Когда я ищу текстовое поле и кнопку по имени, он просто не может их найти. Та же проблема, если я пытаюсь получить к ним доступ через xPath или ID ... Веб-сайт: http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/ (База данных Немецкой ассоциации плавания)

Пока мой код выглядит следующим образом:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

url = "http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/"

driver = webdriver.Chrome()
driver.get(url)

submit_button = driver.find_element_by_name("_submitButton")
fistname_textbox = driver.find_element_by_xpath('//*[@id="_firstnameTextBox"]')
lastname_textbox = driver.find_element_by_xpath('//*[@id="_lastnameTextBox"]')
regid_textbox = driver.find_element_by_id("_regidTextBox")

fistname_textbox.send_Keys("String 1")
lastname_textbox.send_keys("String 2")
submit_button.click()

driver.close()

Если бы кто-нибудь из вас мог помочь мне и выяснить, в чем причина этой проблемы, я был бы очень благодарен :) Я сейчас все больше и больше путаюсь

Ответы [ 4 ]

0 голосов
/ 19 марта 2019

Вам нужно переключиться на фрейм и затем найти элементы

url = "http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/"

driver = webdriver.Chrome()
driver.get(url)
driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@src='https://dsvdaten.dsv.de/Modules/Results/Individual.aspx?Lang=de-DE']'));

// then your code for the Login

submit_button = driver.find_element_by_name("_submitButton")
fistname_textbox = driver.find_element_by_xpath('//*[@id="_firstnameTextBox"]')
lastname_textbox = driver.find_element_by_xpath('//*[@id="_lastnameTextBox"]')
regid_textbox = driver.find_element_by_id("_regidTextBox")

fistname_textbox.send_Keys("String 1")
lastname_textbox.send_keys("String 2")
submit_button.click()

driver.close()
0 голосов
/ 17 марта 2019

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

from selenium import webdriver

url = "http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/"

driver = webdriver.Chrome()
driver.get(url)
driver.switch_to.frame(0);
submit_button = driver.find_element_by_name("_submitButton")
fistname_textbox = driver.find_element_by_xpath('//*[@id="_firstnameTextBox"]')
lastname_textbox = driver.find_element_by_xpath('//*[@id="_lastnameTextBox"]')
regid_textbox = driver.find_element_by_id("_regidTextBox")

fistname_textbox.send_keys("String 1")
lastname_textbox.send_keys("String 2")
submit_button.click()

driver.close()
0 голосов
/ 17 марта 2019

Элементы текстового поля и кнопки находятся в пределах <iframe>, поэтому необходимо:

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

    • Блок кода:

      from selenium import webdriver
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      options = webdriver.ChromeOptions()
      options.add_argument('start-maximized')
      options.add_argument('disable-infobars')
      options.add_argument('--disable-extensions')
      driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
      driver.get("http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/")
      WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[@src='https://dsvdaten.dsv.de/Modules/Results/Individual.aspx?Lang=de-DE']")))
      WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='TextBox' and @id='_firstnameTextBox']"))).send_keys("juliu_mbr")
      driver.find_element_by_xpath("//input[@class='TextBox' and @id='_lastnameTextBox']").send_keys("juliu_mbr")
      driver.find_element_by_xpath("//input[@class='Button' and @id='_submitButton']").click()
      
  • Снимок браузера:

dsv_de

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

0 голосов
/ 17 марта 2019

Весь раздел находится внутри тега <iframe>, сначала нужно переключиться на него

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

wait = WebDriverWait(driver, 5)
wait.until(ec.frame_to_be_available_and_switch_to_it((By.TAG_NAME, 'iframe')))

submit_button = driver.find_element_by_name("_submitButton")
#...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...