Unable to locate element using selenium chrome webdriver in python selenium

China☆狼群 提交于 2021-02-02 09:32:37

问题


I am new to python and trying to do some webscraping but have some real issues. May be you can help me out.

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="">

The first part of my code looks as follows and works good without having any issues:

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 and pwd are variables including my login details. As I said that part works pretty fine.

The issues I have are with the following code line:

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

As a result I get this following error:

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"}
  (Session info: chrome=87.0.4280.88)

I tried and tried but could not solve the problem. I would appreciate it very much, if anyone could help me out. Thank you!


回答1:


To locate the search field you can use either of the following Locator Strategies:

  • Using css_selector:

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

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

Ideally, to locate the element you need to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following Locator Strategies:

  • Using 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']")))
    
  • Using 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']")))
    
  • Note : You have to add the following imports :

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

References

You can find a couple of relevant discussions on NoSuchElementException in:

  • selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element while trying to click Next button with selenium
  • selenium in python : NoSuchElementException: Message: no such element: Unable to locate element



回答2:


The following Xpath will work and is much simpler.

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



回答3:


do not use absolute xpath or css , always use relative as it is more stable

Absolute (Full) xpath will be depended on parent and so if parent changes the locator will fail to find the element

in xpath and css the locator can be used in the form:

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

so you can use any attribute , type, name , id ,class, what ever attribute there in your element eg:

//input[@type="search"]  - xpath
input[type="search"]   - css


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

Try wait:

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



来源:https://stackoverflow.com/questions/65604057/unable-to-locate-element-using-selenium-chrome-webdriver-in-python-selenium

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!