使用Selenium定位iframe中的元素

0 投票
1 回答
37 浏览
提问于 2025-04-14 18:06

使用这个网站:https://buyee.jp/mercari/search?keyword=seiko%20S-212&status=on_sale,或者看看下面的html内容:

包含我们感兴趣元素的HTML

我想找到一个显示“Items 1 to 2”的元素,下面是相关的截图:

我尝试通过xpath来定位这个元素,我的完整代码是:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

val = 'https://buyee.jp/mercari/search?keyword=seiko%20S-212&status=on_sale'
driver = webdriver.Firefox()
driver.get(val)
wait = WebDriverWait(driver, 10)

items = driver.find_element(By.XPATH, '/html/body/div/div/div/div/div[2]/div[2]')

但是我遇到了以下错误:

Traceback (most recent call last):
  File "/home/kali/PycharmProjects/pythonProject/auto.py", line 10, in <module>
    items = driver.find_element(By.XPATH, '/html/body/div/div/div/div/div[2]/div[2]')
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kali/PycharmProjects/pythonProject/.venv/lib/python3.12/site-packages/selenium/webdriver/remote/webdriver.py", line 741, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kali/PycharmProjects/pythonProject/.venv/lib/python3.12/site-packages/selenium/webdriver/remote/webdriver.py", line 347, in execute
    self.error_handler.check_response(response)
  File "/home/kali/PycharmProjects/pythonProject/.venv/lib/python3.12/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: /html/body/div/div/div/div/div[2]/div[2]; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:187:5
NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:505:5
element.find/</<@chrome://remote/content/marionette/element.sys.mjs:135:16


Process finished with exit code 1

1 个回答

0

你的页面使用了一个 iframe

所以,这里有一段有效的代码,里面包含了正确的XPath:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

val = 'https://buyee.jp/mercari/search?keyword=seiko%20S-212&status=on_sale'
driver = webdriver.Firefox()
driver.get(val)
wait = WebDriverWait(driver, 10)

iframe = driver.find_element(By.ID, "search_result_iframe")
driver.switch_to.frame(iframe) # mandatory to change the context

# need to be improved:
wait = WebDriverWait(driver, 10)
import time
time.sleep(10) 
  
# the relevant XPath query, searching by text
item = driver.find_element(By.XPATH, '//div[text()="Items 1 to 2"]')
print(item.text)

# back to main page
driver.switch_to.default_content()

driver.quit()

撰写回答