首页 > 解决方案 > 不明白为什么这段时间没有停止

问题描述

我有一个硒机器人在社交网络上执行操作。我希望它在他做了一定数量的动作后停止(例如 10 个)。我以这种方式初始化变量:

def __init__(self):
    self.browser = webdriver.Firefox()
    self.counter_var = int(0)
    self.max_var = int(10)

这是执行和计数动作的部分:

def action(self, accounts):
    for account in accounts[9:]:
        try:
            self.browser.get(account)
            time.sleep(5)
            like_button = self.browser.find_element_by_xpath(
                                u'//button[contains(@class, "Heart")]').click()
            self.count_actions()
            print(self.counter_var)
        except selenium.common.exceptions.NoSuchElementException:
            break

def count_actions(self):
    self.counter_var += 1

这是我试图进入 main 的循环:

while self.counter_var < self.max_var:
    searched_category = random.choice(pool_categories)
    accounts = self.load_category(searched_category)
    self.action(accounts)

然而,机器人永远不会停止,即使counter_var到达10

你知道如何纠正吗?

标签: python

解决方案


由于缺少给出的代码,目前无法对您的问题给出具体答案,但看起来问题是因为该action()方法在其中的循环执行时没有检查。self.counter_varfor

像下面这样的东西可能会起作用。添加yieldaction()方法中会将其转换为生成器函数,从而使其可迭代。完成后,它将在其for循环的每次迭代中有效地“暂停”,并允许调用者检查self.counter_var(或它想要在每次迭代中执行的任何其他内容)的当前值。

以下是我建议的一些解释性评论:

class Class:
    def action(self, accounts):
        for account in accounts[9:]:
            try:
                self.browser.get(account)
                time.sleep(5)
                like_button = self.browser.find_element_by_xpath(
                                    u'//button[contains(@class, "Heart")]').click()
                self.count_actions()
                print(self.counter_var)
                yield  # Added.
            except selenium.common.exceptions.NoSuchElementException:
                break

    def count_actions(self):
        self.counter_var += 1

    def main(self):
        while True:
            searched_category = random.choice(pool_categories)
            accounts = self.load_category(searched_category)
            for _ in self.action(accounts):  # Iterate through account checks.
                if self.counter_var < self.max_var:  # Too many actions?
                    break

推荐阅读