【问题标题】:Exception: 'str' object has no attribute 'text'例外:“str”对象没有属性“text”
【发布时间】:2017-08-08 14:56:58
【问题描述】:

我正在尝试遍历页面上的元素,然后从元素中获取文本。在获取文本时,我试图删除一个特定的单词“NEW”,然后将其添加到列表中。

这是我的代码。

def test(self, cardname):

    mylist = []
    allrows = self.driver.find_elements_by_xpath("//*[contains(@id, 'scopes-pending-')]")
    count = len(allrows)

    for i in range(count):
        rows = self.driver.find_element_by_id("scopes-" + cardname + "" + str(i) + "").text
        if "NEW" in rows:
            row_split = rows.strip('NEW')
            mylist.append(row_split.text)
        else:
            mylist.append(rows.text)

    return mylist

但是我收到了这个错误

Exception: 'str' object has no attribute 'text'

我尝试了很多不同的方法,但都没有奏效。例如,

rows = self.driver.find_element_by_id("scopes-" + cardname + "" + i + "").text

这给了我以下错误:

Exception: must be str, not int

似乎我遗漏了一些非常小的东西,需要帮助来解决(对于 python 来说还是新手)。任何帮助表示赞赏。

【问题讨论】:

    标签: python selenium webdriver


    【解决方案1】:

    您希望从一开始就做好的一件事是使用描述性变量名称。这将帮助您和其他必须阅读您的代码的人了解您正在尝试做什么。

    我根据自己的最佳猜测更改了一些变量名称。显然,如果我猜错了,可以随意将它们更改为任何有意义的内容。

    mylist -> labelList

    allrows -> rowLabels

    rows -> rowLabel(单数,因为它只有一个)

    删除了一些“额外”变量。如果我不打算再次使用它,我倾向于不创建新变量。例如,count 仅包含 len(allrows)。您可以删除 count 并在 for 循环中唯一出现的位置使用 len(allrows)

    删除了您在定位器中的一些额外 ""s,例如...cardname + "" + str(i) + ""+ "" + 在这里没有做任何事情,因为你只是连接一个空字符串 "" 所以我删除了这些。

    rows.strip() 将在子字符串存在时删除该字符串。如果子字符串不存在,它只返回整个字符串。既然是这种情况,您就不需要if-else

    下面的代码是我的写法。

    def test(self, cardname):
        labelList = []
        allrows = self.driver.find_elements_by_xpath("//*[contains(@id, 'scopes-pending-')]")
    
        for i in range(len(allrows)):
            rowLabel = self.driver.find_element_by_id("scopes-" + cardname + str(i)).text
            labelList.append(rowLabel.strip('NEW'))
    
        return labelList
    

    警告...我不是 python 程序员,所以可能有更多的优化和方法可以使这段代码比我建议的更 python-y。


    关于错误,

    例外:“str”对象没有属性“text”

    row_split = rows.strip('NEW')
    mylist.append(row_split.text)
    

    在上面的行中,row_split 是一个字符串,而您正在执行<string>.text,这会导致错误。 .text 可用于 Web 元素。

    例外:必须是 str,而不是 int

    rows = self.driver.find_element_by_id("scopes-" + cardname + "" + i + "").text
    

    你已经修好了这个。它抱怨iint 而不是字符串。 str(i) 解决了这个问题。

    【讨论】:

      【解决方案2】:

      您是否尝试过仅附加 row_split?如果它是str 对象,它可能您要查找的文本(Python 中的str 是字符串对象)。

      如果您添加了错误所在的行,那也会很有帮助。

      我的猜测是,您的第一个例外是尝试从字符串中的row_split 获取text 属性(我假设从self.driver.find_element_by_id 返回的text 属性的类型为str)。

      然后你会得到第二个异常,尝试连接一个str 和一个int(那就是i)。您将i 转换为str 是对的。

      【讨论】:

      • 感谢您的快速回复。附加rows_split 效果很好,但是该行给了我类似于“test NEW”的字符串,我想从字符串中删除“NEW”这个词。你对其他人是正确的。我正在尝试从self.driver.find_element_by_id 获取字符串
      • @Bubbles 你确定strip 是正确的方法吗?文档(适用于您的 API 和 Python)是您的朋友,您为什么不看看 strip 的文档并看看它是如何使用的?如果这不是正确的方法,请尝试使用谷歌搜索(或在此处搜索)以找到您想要的方法。
      猜你喜欢
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2015-09-11
      相关资源
      最近更新 更多