【问题标题】:Selenium - can´t find select-elementSelenium - 找不到选择元素
【发布时间】:2021-12-23 20:46:54
【问题描述】:

我尝试自动化这个网页: https://www.crownandcaliber.com/pages/sell-my-watch-iq#top

我正在使用以下代码,直到页面上的选择元素为止都可以正常工作:

import time
from selenium import webdriver
import undetected_chromedriver as uc
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from fake_useragent import UserAgent

if __name__ == '__main__':
  WAIT = 5
  link = "https://www.crownandcaliber.com/pages/sell-my-watch-iq#top"
  ua = UserAgent()
  userAgent = ua.random
  options = Options()
  # options.add_argument('--headless')
  options.add_experimental_option ('excludeSwitches', ['enable-logging'])
  options.add_argument("start-maximized")
  options.add_argument('window-size=1920x1080')                               
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-gpu')  
  options.add_argument(f'user-agent={userAgent}')   
  srv=Service(ChromeDriverManager().install()) 
  driver = webdriver.Chrome (service=srv, options=options)                 
  driver.get (link) 
  time.sleep(WAIT)

  driver.find_element(By.XPATH, "//button[@id='onetrust-accept-btn-handler']").click()
  time.sleep(WAIT)
  print(f"Try to close info window...")
  try:
    driver.find_element(By.XPATH, "//button[@title='Close']").click()
  except:
    pass
  time.sleep(1)
  driver.find_element(By.XPATH,'//select').click()

当我运行此代码时,我收到以下错误:

Try to close info window...
Traceback (most recent call last):
  File "C:\DEV\Fiverr\TRY\ymarket1ng\checkClocks.py", line 50, in <module>
    driver.find_element(By.XPATH,'//select').click()
  File "C:\DEV\.venv\Normal\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1153, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\DEV\.venv\Normal\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 400, in execute 
    self.error_handler.check_response(response)
  File "C:\DEV\.venv\Normal\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 236, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//select"}
  (Session info: chrome=94.0.4606.71)

当我检查站点时,我发现 XPATH "//select" 的单个元素

那么为什么在使用 Selenium 运行它时这不起作用?

【问题讨论】:

    标签: python selenium web-scraping xpath selenium-chromedriver


    【解决方案1】:

    该元素在 iframe 内。您需要切换到该 iframe 才能访问它。
    这应该有效:

    import time
    from selenium import webdriver
    import undetected_chromedriver as uc
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from webdriver_manager.chrome import ChromeDriverManager
    from fake_useragent import UserAgent
    
    if __name__ == '__main__':
      WAIT = 5
      link = "https://www.crownandcaliber.com/pages/sell-my-watch-iq#top"
      ua = UserAgent()
      userAgent = ua.random
      options = Options()
      # options.add_argument('--headless')
      options.add_experimental_option ('excludeSwitches', ['enable-logging'])
      options.add_argument("start-maximized")
      options.add_argument('window-size=1920x1080')                               
      options.add_argument('--no-sandbox')
      options.add_argument('--disable-gpu')  
      options.add_argument(f'user-agent={userAgent}')   
      srv=Service(ChromeDriverManager().install()) 
      driver = webdriver.Chrome (service=srv, options=options)                 
      driver.get (link) 
      time.sleep(WAIT)
    
      driver.find_element(By.XPATH, "//button[@id='onetrust-accept-btn-handler']").click()
      time.sleep(WAIT)
      print(f"Try to close info window...")
      try:
        driver.find_element(By.XPATH, "//button[@title='Close']").click()
      except:
        pass
      time.sleep(1)
      iframe = driver.find_element_by_xpath("//iframe[contains(@src,'consumer')]")
      driver.switch_to.frame(iframe)
      driver.find_element(By.XPATH,'//select').click()
    

    UPD
    以下是您如何查看iframe

    【讨论】:

    • 是的,现在它正在工作 - 非常感谢 - 但我怎么知道在硒中找不到一个元素(我在检查时使用 xpath 以“正常”方式找到的)它在 iframe 中...?在检查页面并尝试 xpath for selenium 时,有什么方法可以检查这一点吗?
    • 当您打开开发工具 (F12) 时,您可以看到该页面的 HTML。如果在主体和所需元素之间存在标签名称为 iframe 的元素 - 这意味着您所需的元素位于 iframe 内。查看更新的答案。
    • 好的 - 谢谢 - 但是为什么 xpath 不工作?当我输入 xpath 时,找到了元素 - 当我在 selenium 中进行相同的搜索时,它没有找到(我必须先切换到 iframe,然后才能像你向我展示的那样进行搜索)。为什么 iframe 与其他标签不同?
    • 阅读此处toolsqa.com/selenium-webdriver/handle-iframes-in-selenium 或任何其他类似教程。
    猜你喜欢
    • 2014-08-08
    • 1970-01-01
    • 2019-01-02
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多