Search code examples
pythonselenium-webdriverweb-scrapingxpath

Using Selenium to locate element in iframe


Using this site: (https://buyee.jp/mercari/search?keyword=seiko%20S-212&status=on_sale) or see the html below:

HTML with Element of Interest

I'm trying to locate the element that has the value: "Items 1 to 2", please see screenshot below:

I tried locating the element by xpath, my full code:

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]')

However I get the following errors:

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

Solution

  • Your page use an iframe.

    So, this is a working code with valid 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()