【问题标题】:Unable to locate element using selenium chrome webdriver in python selenium无法在 python selenium 中使用 selenium chrome webdriver 定位元素
【发布时间】:2021-04-12 16:31:39
【问题描述】:

我是 python 新手,正在尝试做一些网页抓取,但有一些实际问题。或许你能帮帮我。

HTML:

<input autocomplete="off" type="search" name="search-search-field" placeholder="150k companies worldwide" data-cy-id="search-search-field" class="sc-dnqmqq grpFhe" value="">

我的代码的第一部分如下所示,运行良好,没有任何问题:

driver.get("https:")
login = driver.find_element_by_xpath(email_xpath).send_keys(email)
login = driver.find_element_by_xpath(pwd_xpath).send_keys(pwd)
login = driver.find_element_by_xpath(continue_xpath)
login.click()
time.sleep(10)

email 和 pwd 是变量,包括我的登录详细信息。正如我所说,这部分工作得很好。

我遇到的问题与以下代码行有关:

search = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/header/div/nav/div[1]/div/div/fieldset/input')

因此我收到以下错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]/div/div[1]/header/div/nav/div[1]/div/div/fieldset/input"}
 

我试了又试,但无法解决问题。如果有人可以帮助我,我将不胜感激。谢谢!

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    不要使用绝对的 xpath 或 css ,总是使用相对的,因为它更稳定

    绝对(完整)xpath 将取决于父级,因此如果父级更改,定位器将无法找到元素

    在 xpath 和 css 中,定位器可以以如下形式使用:

    //tagname[@attributename="attriubutevalue"]   - Xpath
    tagname[attributename="attriubutevalue"]      - CSS
    

    因此您可以使用任何属性、类型、名称、id、类,以及元素中的任何属性,例如:

    //input[@type="search"]  - xpath
    input[type="search"]   - css
    
    
    search = driver.find_element_by_xpath('//input[@type="search"]')
    

    尝试等待:

    WebDriverWait(driver,15).until(EC.presence_of_element_located((By.XPATH, '//input[@type="search"]')))
    

    【讨论】:

    • Ty PDHide,你有具体的程序代码我可以测试吗?
    • @Numpy search = driver.find_element_by_xpath('//input[@type="search"]')
    • Ty,但不幸的是仍然出现以下错误:selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“method”:“xpath”,“selector”:” //输入[@type="search"]"}
    • @Numpy 当你使用 wait 时会发生什么? WebDriverWait(driver,15).until(EC.presence_of_element_located((By.XPATH, '//input[@type="search"]'))) ,没有理由它不应该工作
    • 不幸的是仍然返回错误:WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, '//input[@type="search"]'))) File " ...venv\lib\site-packages\selenium\webdriver\support\wait.py",第 80 行,直到引发 TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
    【解决方案2】:

    要找到搜索字段,您可以使用以下任一Locator Strategies

    • 使用css_selector

      search = driver.find_element_by_css_selector("input[name='search-search-field'][data-cy-id='search-search-field']")
      
    • 使用xpath:

      search = driver.find_element_by_xpath("//input[@name='search-search-field' and @data-cy-id='search-search-field']")
      

    理想情况下,要找到您需要为element_to_be_clickable() 诱导WebDriverWait 的元素,您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      search = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='search-search-field'][data-cy-id='search-search-field']")))
      
    • 使用XPATH

      search = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='search-search-field' and @data-cy-id='search-search-field']")))
      
    • 注意:您必须添加以下导入:

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

    参考文献

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

    【讨论】:

    • 嗨 DebanjanB,非常感谢,但不幸的是,使用 css_selector 和使用您的 xpath 示例都对我有用。我仍然收到如下错误:selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“method”:“css selector”,“selector”:“input [name ='search-overlay-search -field'][data-cy-id='search-overlay-search-field']"} 或者如果我使用 WebDriverWait: search = Web ....) 文件“D:\...”,第 80 行,在直到 raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
    • @Numpy 这就是我们需要基于文本的元素相关 HTML 的实际原因,以便我们可以在发布之前测试我们的解决方案。
    • 这太奇怪了。由于我使用另一个代码行最大化浏览器窗口使用 xpath 方法的建议,它运行没有任何错误。我使用以下代码: search_xpath = "//input[@name='search-search-field' and @data-cy-id='search-search-field']" driver.maximize_window() search = WebDriverWait(driver , 15).until(EC.presence_of_element_located((By.XPATH, search_xpath))).send_keys("test")
    • 感谢您的支持 DebanjanB,element_to_be_clickable 也可以正常工作,但前提是我之前使用了 Maximize_window()。
    • 太好了,感谢您的支持!
    【解决方案3】:

    下面的 Xpath 可以工作,而且更简单。

    /html/body/div[1]//fieldset/input
    

    【讨论】:

    • Ty James,为我工作!你能告诉我你是如何获得xpath的吗?我使用的xpath,我只是使用了谷歌浏览器的检查选项,并复制了完整的xpath。
    • 使用 chrome 开发者工具我注意到你正在寻找的元素是 fieldset 元素的第一个实例。我简化了您在第一个字段集中获取输入的路径。这实际上可以简化为//fieldset/input
    • 太棒了,詹姆斯!
    猜你喜欢
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多