Python Selenium не может собирать элементы с помощью xpath - PullRequest
0 голосов
/ 24 июня 2019

Вот мой код Python

from selenium import webdriver
import time

driver = webdriver.Chrome('/usr/local/bin/chromedriver')
driver.get("https://www.immoweb.be")
elem1 = driver.find_element_by_link_text('FRANCAIS')
elem1.click()
elem2 = driver.find_element_by_link_text('Maisons')
elem2.click()
time.sleep(2)
#searchBar = driver.find_element_by_xpath('//*[@id="localisation"]')
searchBar = driver.find_element_by_name('localisation')
searchbar.send_keys('hello')

Я хотел бы добавить текст в поле "локализация", но я получил следующее сообщение об ошибке.

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="localisation"]"}

Я попробовалточно такой же код на другом сайте, и он работает правильно.

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Ваш вход "локализация" находится под iframe , поэтому вы не можете найти его

enter image description here

Вам нужно будет вызвать функцию WebDriver.switch_to () , чтобы изменить контекст на вышеупомянутый iframe, прежде чем пытаться взаимодействовать с элементами внутри него.

driver.switch_to.frame("IWEB_IFRAME_ID_SEARCH")

Также рассмотрите возможность рефакторинга вашего кода для удаления sleep и использования Waits вместо этого, это сделает ваш тест намного быстрее, надежнее и надежнее. Более того, некоторые элементы загружаются с использованием технологии AJAX , поэтому они могут быть недоступны сразу, даже если Selenium «считает», что загрузка страницы завершена.

Предлагаемые изменения кода:

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

driver = webdriver.Chrome("/usr/local/bin/chromedriver")
driver.maximize_window()
driver.get("https://www.immoweb.be")
elem1 = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.LINK_TEXT, "FRANCAIS")))
elem1.click()
elem2 = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.LINK_TEXT, "Maisons")))
elem2.click()


driver.switch_to.frame("IWEB_IFRAME_ID_SEARCH")
searchBar = elem2 = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.NAME, "localisation")))
searchBar.send_keys('hello')
driver.quit()
0 голосов
/ 25 июня 2019

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

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

    • Блок кода:

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
      chrome_options = webdriver.ChromeOptions() 
      chrome_options.add_argument("start-maximized")
      # chrome_options.add_argument('disable-infobars')
      driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get("https://www.immoweb.be")
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "FRANCAIS"))).click()
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Maisons"))).click()
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#IWEB_IFRAME_ID_SEARCH")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#localisation"))).send_keys('Henri')
      
  • Снимок браузера:

Henri

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

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