【问题标题】:Python Selenium not able to collect element using xpathPython Selenium 无法使用 xpath 收集元素
【发布时间】:2019-11-06 15:10:14
【问题描述】:

这是我的 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"]"}

我在其他网站上尝试了完全相同的代码,它运行正常。

【问题讨论】:

    标签: python-3.x selenium-webdriver iframe css-selectors webdriverwait


    【解决方案1】:

    您的“本地化”输入位于 iframe 下,这就是您无法找到它的原因

    您需要调用WebDriver.switch_to() 函数,以便在尝试与其中的元素交互之前将上下文更改为上述 iframe。

    driver.switch_to.frame("IWEB_IFRAME_ID_SEARCH")
    

    还可以考虑重构您的代码以删除sleep 并改用Waits,这将使您的测试更快、更健壮和更可靠。此外,某些元素正在使用AJAX technology 加载,因此即使 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()
    

    【讨论】:

      【解决方案2】:

      要将字符序列发送到localisation 字段,因为所需元素位于<iframe> 内,因此您必须:

      • 诱导 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')
          
      • 浏览器快照:

      在这里你可以找到Ways to deal with #document under iframe的相关讨论

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        • 1970-01-01
        相关资源
        最近更新 更多