【问题标题】:TypeError: 'WebElement' object is not subscriptableTypeError:“WebElement”对象不可下标
【发布时间】:2020-03-03 04:05:54
【问题描述】:

我尝试使用 Python 按下 Spotify Web Player 上的重播按钮,但出现此错误。如何在网络播放器中按下按钮?

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()

错误:

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]
TypeError: 'WebElement' object is not subscriptable

【问题讨论】:

  • find_element_by_xpath() 返回单个项目,而不是列表。你为什么在上面使用[0]
  • 删除[0],因为您使用的是find_element_by_xpath()
  • 哈哈,谢谢,它成功了。
  • 表示 ("""/html/body/div[2]/div/div[4]/div[3]/footer/div/div[2]/div/div [1]/div[5]/button""") 不返回列表...可能您指向错误的元素

标签: python selenium selenium-webdriver webdriver typeerror


【解决方案1】:

对于遇到此错误的每个人:您可能将 driver.find_element()driver.find_elements() 混淆了,并且您试图从 WebElement 对象中获取单数项目,而不是从 list 中检查您的代码

driver.find_elements() 返回相应 WebElement 的列表

还有另一个功能 - driver.find_element(),您可以这样说:
driver.find_element() = driver.find_elements()[0]


在这个例子中,Python 试图从driver.find_element() 对象中获取第一项,它返回一个WebElement 对象,而不是list

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]

【讨论】:

    【解决方案2】:

    此错误消息...

    TypeError 'WebElement' object is not subscriptable
    

    ...暗示您已将索引附加到不支持的WebElement


    分析

    只有 list 元素可以被索引。但是,在这行代码中:

    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""") 总是会返回一个single WebElement。因此,您无法通过任何索引访问元素,例如[0][1] 等作为 index 只能与 list 关联。


    解决方案

    有两种方法可以解决这个问题。

    • 在第一种方法中,您可以删除索引,即[0],在这种情况下,replay 将分配给通过locator strategy 标识的第一个匹配元素,如下所示:

      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""")
      
    • 在另一种方法中,您可以使用find_elements_by_xpath() 创建一个列表,而不是使用find_element_by_xpath(),并使用索引@ 访问列表 中的第一个元素987654334@如下:

      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]
      

    参考

    您可以在以下位置找到一些相关讨论:

    【讨论】:

      【解决方案3】:
      find_element_by_xpath
      

      返回第一个找到的元素(不是数组)

      find_element_by_xpath(...).click()
      

      find_elements_by_xpath(...)[0].click()
      

      【讨论】:

      • 请详细说明一下。不同的命令有什么区别?
      • 一个是复数返回多个元素另一个是单数,只返回一个。
      【解决方案4】:

      正如@KunduK 评论删除[0]

      不建议您使用绝对 xPath。

      尝试使用相对 xPath...

      如果有几个按钮,您需要首先在 xpath 中使用 [0],如下所示:

      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() 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-12
        • 2020-11-09
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        • 2023-03-06
        • 2017-07-15
        相关资源
        最近更新 更多