TypeError: 'WebElement' object is not subscriptable

前端 未结 3 1966
灰色年华
灰色年华 2021-01-24 02:43

I try to press the Replay button at Spotify Web Player with Python, but get this error. How can I press buttons in a webplayer?

replay = driver.find_element_by_xp         


        
相关标签:
3条回答
  • 2021-01-24 02:54
    find_element_by_xpath
    

    returns first found element (not array)

    find_element_by_xpath(...).click()
    

    or

    find_elements_by_xpath(...)[0].click()
    
    0 讨论(0)
  • 2021-01-24 03:02

    As @KunduK commented remove the [0].

    You are using absolute xPath this is not recommended.

    Try using relative xPath...

    If there are a few buttons and you need the first use the [0] in the xpath like so:

    replay = driver.find_element_by_xpath("""/html/body/div[2]/div/div[4]/div[3]/footer/div/div[2]/div/div[1]/div[5]/button[0]""")
    replay.click() 
    
    0 讨论(0)
  • 2021-01-24 03:09

    This error message...

    TypeError 'WebElement' object is not subscriptable
    

    ...implies that you have attached an index to a WebElement which is not supported.


    Analysis

    Only list elements can be indexed. However, in this line of code:

    replay = driver.find_element_by_xpath("""/html/body/div[2]/div/div[4]/div[3]/footer/div/div[2]/div/div[1]/div[5]/button""")[0]
            
    

    driver.find_element_by_xpath("""/html/body/div[2]/div/div[4]/div[3]/footer/div/div[2]/div/div[1]/div[5]/button""") would always return a single WebElement. Hence you can't access the element through any index, e.g. [0], [1], etc as an index can be associated only with a list.


    Solution

    There are two approaches to solve the issue.

    • In the first approach, you can remove the index, i.e. [0], and in that case replay will be assigned with the first matched element identified through locator strategy as follows:

      replay = driver.find_element_by_xpath("""/html/body/div[2]/div/div[4]/div[3]/footer/div/div[2]/div/div[1]/div[5]/button""")
      
    • In the other approach, instead of using find_element_by_xpath() you can create a list using find_elements_by_xpath() and access the very first element from the List using the index [0] as follows:

      replay = driver.find_elements_by_xpath("""/html/body/div[2]/div/div[4]/div[3]/footer/div/div[2]/div/div[1]/div[5]/button""")[0]
      

    Reference

    You can find a couple of relevant discussions in:

    • Exception has occurred: TypeError 'WebElement' object is not subscriptable
    0 讨论(0)
提交回复
热议问题