如何避免Selenium Python中的NoSuchElementException

如何避免Selenium Python中的NoSuchElementException,python,selenium,web-scraping,Python,Selenium,Web Scraping,我正在制作一个python音乐播放器,它使用Youtube音乐通过无头chrome浏览器播放音乐。然而,当我填写歌曲名称的输入表单时,有时会得到一个NoTouchElementException。这种情况发生的频率比没有发生的频率要低,如果没有发生,代码就会顺利运行,没有任何问题 以下是我的代码部分: def searchMusic(): ask = input("What song would you like to listen to?: ") print

我正在制作一个python音乐播放器,它使用Youtube音乐通过无头chrome浏览器播放音乐。然而,当我填写歌曲名称的输入表单时,有时会得到一个NoTouchElementException。这种情况发生的频率比没有发生的频率要低,如果没有发生,代码就会顺利运行,没有任何问题

以下是我的代码部分:

def searchMusic():
    ask = input("What song would you like to listen to?: ")
    print("- - - - - - - - ")
    if ask != " ":
        driver.implicitly_wait(10)
        search_initiate = driver.find_element_by_xpath('//*[@id="icon"]')
        search_initiate.click()
        search_bar = WebDriverWait(driver,10).until(IF.presence_of_element_located((By.XPATH,
        '/html/body/ytmusic-app/ytmusic-app-layout/ytmusic-nav-bar/div[2]/ytmusic-search-box/div/div[1]/input')))
        driver.implicitly_wait(10)
        search_bar.send_keys(ask)
        search_bar.send_keys(Keys.ENTER)
        heading1 = driver.find_elements_by_xpath('//*[@id="contents"]/ytmusic-responsive-list-item-renderer')
        for i in range(4):
            print(heading1[i].text)
            print("- - - - - - -")
这里有一个例外:

 File "/Users/kevinhadinata/Desktop/Python/headless.py", line 92, in <module>
    searchMusic()
  File "/Users/kevinhadinata/Desktop/Python/headless.py", line 56, in searchMusic
    search_initiate = driver.find_element_by_xpath('//*[@id="icon"]')
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="icon"]"}
  (Session info: headless chrome=85.0.4183.102)
文件“/Users/kevinhadinata/Desktop/Python/headless.py”,第92行,在
搜索音乐()
searchMusic中的文件“/Users/kevinhadinata/Desktop/Python/headless.py”,第56行
搜索\u initiate=driver。通过\u xpath('/*[@id=“icon”]”查找\u元素
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site packages/selenium/webdriver/remote/webdriver.py”,第394行,在find_element_by_xpath中
返回self.find_元素(by=by.XPATH,value=XPATH)
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site packages/selenium/webdriver/remote/webdriver.py”,第976行,在find_元素中
返回self.execute(Command.FIND_元素{
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site packages/selenium/webdriver/remote/webdriver.py”,执行中第321行
self.error\u handler.check\u响应(响应)
文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:{“方法”:“xpath”,“选择器”:“/*[@id=“icon”]”
(会话信息:无头镀铬=85.0.4183.102)

非常感谢您的帮助。请提前感谢

只需检查元素是否存在:

check = driver.find_elements_by_xpath('//*[@id="icon"]')
if len(check) > 0:
    go further
else:
    no data

我试过了,但是如果我不能选择搜索栏,整个程序难道不是毫无用处吗?@ZarakiKenpachi@KevinH然后你需要搜索为什么这个元素不可见。这不是一个统一的情况。每个网页都有不同的方法来显示一些元素。是的,我现在有点难以找到原因,但我我想一些关于可能原因的建议会有所帮助。@Kevin H如果没有最小的可复制代码示例,则不可能提供帮助。我尝试过,现在它给了我一个TimeOutException。您是否引用了错误消息?因为我已经在Youtube音乐的post.URL中包含了代码?@DebanjanB它已经设置好了,driver.get('))
Please use proper method to wait element so you can ignore nosuchelement issue,If you write and keep wait method in your program you can use that method anywhere and anytime in your programme 

------------------------------------------------------

     private static WebElement waitForElement(By locator, int timeout)
    {
        WebElement element=new WebDriverWait(driver,timeout).until(ExpectedConditions.presenceOfElementLocated(locator));
        return element;
    }
    ------------------------------------------------------

// for example if you want wait an element with id use below code 
waitForElement(By.id(""),20);
20 is milliseconds