是什么导致此Python代码有时失败?

时间:2019-05-14 19:03:53

标签: python selenium

class Websites
    default = 'https://google.com'
    spotify = 'https://spotify.com'
    facebook = 'https://facebook.com'
    twitter = 'https://twitter.com'

[...]

from websites import Websites

random_website = random.choice(list(vars(Websites).values()))
browser.get(random_website)  # This line fails like 30-50% of the time

请注意,我故意不在此处使用字典,因为我想使用随机值来获取密钥。

调试时,我发现它将随机设置为以下内容: random_website = {getset_descriptor} <attribute '__dict__' of 'Websites' objects>

我真的不确定为什么它不起作用,因为我已经多次测试了所有URL。

还请注意,此应用程序使用线程-该应用程序有多个实例(通常为4个),并且在任何给定时间大约有1-2个失败,以防万一。我对Python和Selenium还是很陌生(说实话,对编码仍然没有经验)。请让我知道是否可以提供更多有用的信息。

2 个答案:

答案 0 :(得分:3)

vars(Websites)

  1. 是字典
  2. 其中包含各种对象,主要是从object
  3. 继承的

如果打印它,您将看到各种东西,例如未绑定方法和其他常规对象属性。发生这种情况是因为对象的__dict__自动获取了type元类分配的一些默认元素。所有这些属性都应该是笨拙的。

因此,您有两个选择:

  1. 在您当前的课程中坚持下来并筛选出令人沮丧的内容:

    items = [v for k, v in vars(Website).items() if not k.startswith('__')]
    

    这不是推荐的方法。

  2. 只需使用仅包含所需内容的普通词典即可。您正以任何一种方式呼叫values。如果您真的不需要标签,请使用列表。

答案 1 :(得分:3)

您在对Mad Physicists的回答的注释中非常清楚地阐明了您的思维过程,因此您只需要一个Python微型教程即可。

A。如何存储数据。如上所述,字典可能是最好的方法,将字符串作为键和值。您可能想处理字符串,而不是变量。

websites = {'default':'https://www.google.com', 'stack':'https://stackoverflow.com'}

B。您可以获取字典中所有键的列表,或称为 tuples 的(键,值)对的列表。这意味着将vars(Websites).values()替换为websites.keys()websites.items()。然后,您的代码将为您提供随机密钥或项目。

C。如果选择```keys()``,则可以只打印得到的随机数,然后使用该键从字典中获取相应的值。

random_key = random.choice(websites.keys())
print(random_key)
random_website = websites[random_key] # this is how you get values using keys

D。如果选择items(),则得到的元组基本上是一个不可变的列表(您不能更改或分配任何一个值)。您可以通过在列表中指定索引来拉出它们。 Python索引从0开始。

random_item = random.choice(websites.items())
print(random_item) # something like ('default', 'https://www.google.com')
random_key = random_item[0] # this is how you choose an item from a list or tuple
print(random_key)
random_website = random_item[1]