【问题标题】:Selenium/Python: Error click a button whose address is with JavaScript, onclick [duplicate]Selenium / Python:错误单击地址为JavaScript的按钮,onclick [重复]
【发布时间】:2017-11-01 02:16:07
【问题描述】:

我一直在尝试单击 href="javascript:;"在使用 selenium 和 python 的页面上。

相关的HTML代码是:

<tr>
  <td class="Sun out">24</td>
  <td class=" out">25</td>
  <td class=" out">26</td>
  <td class=" out">27</td>
  <td class=" out">28</td>
  <td id="CellPlayDate0" class=" able"><a href="javascript:;" onclick="fnSelectPlayDate(0, '20171229')">29</a></td>
  <td id="CellPlayDate1" class=" able"><a href="javascript:;" onclick="fnSelectPlayDate(1, '20171230')">30</a></td>
</tr>

对于代码,我有:

browser.find_elements_by_xpath('//*[@id="CellPlayDate0"]').click()

对应的错误信息是:

AttributeError: 'list' object has no attribute 'click'

我认为元素是列表,所以我尝试如下

browser.find_elements_by_xpath('//td[@id="CellPlayDate1"]')[0].click()

但是,另一个错误

IndexError: list index out of range

我认为还有另一种单击按钮的方法(javascript,onclick)。但是,我是硒的初学者,所以我不知道。

有什么想法吗?

【问题讨论】:

    标签: javascript python selenium onclick click


    【解决方案1】:

    似乎browser.find_elements_by_xpath('//*[@id="CellPlayDate0"]') 返回了list 的元素。

    你需要选择一个元素并创建点击事件可能就像

    browser.find_elements_by_xpath('//*[@id="CellPlayDate0"]')[0].click()

    【讨论】:

    • 我试过了。但是,有一个 IndexError: list index out of range。
    • 在这种情况下,您的 xpath 表达式 '//*[@id="CellPlayDate0"]' 与 html 页面中的任何 id 都不匹配。
    • 实际上,我使用 copy xpath 在页面中复制该 html 代码
    • 你能用html页面的sn-p编辑原始问题吗?
    • 你能再检查一下吗
    【解决方案2】:

    错误说明了一切:

    AttributeError: 'list' object has no attribute 'click'
    

    根据您的代码块,您有:

    browser.find_elements_by_xpath('//*[@id="CellPlayDate0"]').click()
    

    而不是WebElement 返回List。因此,当您尝试单击 List 时,您会看到错误为 AttributeError: 'list' object has no attribute 'click'

    解决方案是将方法find_elements_by_xpath 更改为find_element_by_id 或构造一个唯一的xpath,如下所示:

    • 由于WebElement 有一个id

      browser.find_elements_by_id("CellPlayDate0').click()
      
    • 构造一个xpath

      browser.find_elements_by_xpath("//td[@id='CellPlayDate0']").click()
      

    【讨论】:

      【解决方案3】:

      这里的问题是你在&lt;td&gt; 列表上调用click() 而不是&lt;a&gt; 锚点,它实际上有你想要的点击。试试这个:

      browser.find_element_by_xpath('//*[@id="CellPlayDate0"]/a').click()
      

      注意使用find_element_by_xpath 而不是find_element[s]_by_xpath?或者使用 css:

      browser.find_element_by_css_selector('#CellPlayDate0 a').click()
      

      【讨论】:

      • 还是有同样的错误,AttributeError: 'list' object has no attribute 'click'
      【解决方案4】:

      你有两个问题。

      首先,xpath 表达式返回一个列表,正如其他答案所指出的那样。 Python 列表没有点击方法,返回的元素有。

      其次,您的 xpath 表达式实际上并没有找到任何东西。它返回一个没有匹配项的空列表,这就是您得到索引超出范围错误的原因。

      你可能想要的是这个:

      for elem in browser.find_elements_by_xpath('//*[@id="CellPlayDate0"]'):
          elem.click()
      

      请注意,您仍然需要调整 xpath 字符串以实际匹配页面上的某些内容。

      【讨论】:

      • 没有错误。但是,按钮没有被点击。
      猜你喜欢
      • 2023-03-23
      • 2016-04-29
      • 2014-07-14
      • 1970-01-01
      • 2019-03-17
      • 2020-01-08
      • 2020-10-16
      • 1970-01-01
      • 2017-05-28
      相关资源
      最近更新 更多