我试图遍历页面上的元素,然后从元素中获取文本。在收到文本的同时,我试图删除一个特定的单词" 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的新手)。任何帮助表示赞赏。
答案 0 :(得分:1)
您想从一开始就想要做的一件事就是使用描述性变量名称。这将帮助您和其他必须阅读您的代码的人了解您的目标。
我用我最好的猜测改变了一些变量名称。如果我猜错了,显然可以随意将它们改成任何有意义的东西。
mylist
- > labelList
allrows
- > rowLabels
rows
- > rowLabel
(单数,因为它只有一个)
删除了一些“额外”变量。如果我不打算再次使用它,我倾向于不创建新的变量。例如,count
只保留len(allrows)
。您可以移除count
,只需在len(allrows)
循环中显示的唯一位置使用for
。
删除了定位器中的一些额外""
,例如...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
你已经修好了这个。它抱怨i
是int
而不是字符串。 str(i)
解决了这个问题。
答案 1 :(得分:0)
您是否尝试过添加row_split
?如果它是str
对象,则 可能您要查找的文本(Python中的str
是字符串对象。)
如果您添加了错误信息,那么该信息也很有用。
我的猜测是,您的第一个例外是尝试从字符串text
获取row_split
属性(我假设从text
返回的self.driver.find_element_by_id
属性属于str
)类型。
然后,您尝试连接str
和int(即i
)时遇到第二个异常。您将i
投射到str
。