【问题标题】:Type in a textbox via python: unable to locate element通过python输入文本框:无法定位元素
【发布时间】:2021-03-29 14:33:06
【问题描述】:

我正在尝试使用 python selenium 定位一个元素,并具有以下 html:

<input class="form-control" type="text" placeholder="University Search">

我找不到在哪里输入我想输入的内容。

from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path=r"D:\Python\Lib\site-packages\selenium\chromedriver.exe")
driver.get('https://www.topuniversities.com/university-rankings/university-subject-rankings/2020/engineering-technology')

#<input class="form-control" type="text" placeholder="University Search">

text_area = driver.find_element_by_name('University Search')
text_area.send_keys("oxford university")

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    要向元素发送字符序列,您可以使用以下任一Locator Strategies

    • 使用css_selector:

      driver.find_element_by_css_selector("input.form-control[placeholder='University search']").send_keys("oxford university")
      
    • 使用xpath

      driver.find_element_by_xpath("//input[@class='form-control' and @placeholder='University search']").send_keys("oxford university")
      

    理想情况下,要将字符序列发送到您需要为element_to_be_clickable()诱导WebDriverWait的元素,您可以使用以下Locator Strategies之一:

    • 使用CSS_SELECTOR

      driver.get("https://www.topuniversities.com/university-rankings/university-subject-rankings/2020/engineering-technology")
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.form-control[placeholder='University search']"))).send_keys("oxford university")
      
    • 使用XPATH:

      driver.get("https://www.topuniversities.com/university-rankings/university-subject-rankings/2020/engineering-technology")
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='form-control' and @placeholder='University search']"))).send_keys("oxford university")
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
    • 浏览器快照:


    参考

    您可以在NoSuchElementException 上找到一些相关讨论:

    【讨论】:

      【解决方案2】:

      确保您使用 webdriver waits 等待页面加载,单击弹出窗口,然后继续定位要向其发送密钥的元素。

      driver.get('https://www.topuniversities.com/university-rankings/university-subject-rankings/2020/engineering-technology')
      driver.maximize_window()
      wait=WebDriverWait(driver, 10)
      wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='OK, I agree']"))).click()
      text_area=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR ,"td.uni-search.uni.sorting_disabled > div > input")))
      text_area.send_keys("oxford university")
      

      进口

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

      要定位的元素

      <input class="form-control" type="text" placeholder="University Search">
      

      【讨论】:

        【解决方案3】:

        您正在尝试使用find_element_by_name,但该元素没有定义name 属性。您需要查找具有您感兴趣的特定 placeholder 属性的元素 - 您可以为此使用 find_element_by_xpath

        text_area = driver.find_element_by_xpath("//input[@placeholder='University Search']")
        

        另外:当我打开浏览器时,我在占位符中看不到带有“大学搜索”的元素,只有带有“站点搜索”的搜索栏 - 但这可能是区域和/或浏览器的差异.

        【讨论】:

        • 这给出一个错误:“selenium.common.exceptions.Element Not Interactable Exception: Message: element not interactable”
        • 很可能有一个弹出窗口隐藏它...标准解决方案是使用ActionChains,尝试stackoverflow.com/questions/44119081/…
        【解决方案4】:

        非常接近,当一切都失败时尝试 XPath:

        text_area = driver.find_element_by_xpath("//*[@id='qs-rankings']/thead/tr[3]/td[2]/div/input")
        

        如果您正在检查网页的 html,您可以将完整/相对 XPath 复制到剪贴板。

        【讨论】:

        • 这段代码背后的逻辑是什么?尤其是“[@id='qs-rankings']/thead/tr[3]/td[2]/div/input”部分。
        • XPath 是一种用于导航类似 XML 的结构的查询语言。通过遵循从网页的根元素或相对元素(DOM 结构的中间)开始指向 input 元素的“路径”,您可以使用此方法定位特定元素。在这个特定的例子中,您正在查看一个相对 XPath,它从 table 元素开始,id 为 qs-rankings
        猜你喜欢
        • 1970-01-01
        • 2020-05-28
        • 2020-12-26
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多