Selenium Python错误对象没有属性' create_driver'

发布于 2025-02-12 20:52:35 字数 3437 浏览 2 评论 0原文

我有一个名为search_controller.py的文件。 错误。我希望该文件打开Firefox浏览器并搜索传递给它的查询。

错误:

attributeError:'searchController'对象没有属性'create_driver'

是代码:

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import FirefoxProfile, ChromeOptions
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from time import sleep
from webdriver_setup import get_webdriver_for
from config import logger
from translations import contains_ad


class SearchController:

    URL = "https://www.google.com"
    SEARCH_INPUT = (By.NAME, "q")

    def __init__(self, query, browser="firefox", ad_visit_time=4):

        self._search_query = query
        self._ad_visit_time = ad_visit_time

        self._driver = self._create_driver(browser.lower())
        self._load()

    def search_for_ads(self):
        """
        :Start search for the given query and return ads if any
        :rtype: list
        :returns: List of (ad, ad_link) tuples
        """

        logger.info(f"Starting search for '{self._search_query}'")

        search_input_box = self._driver.find_element(*self.SEARCH_INPUT)
        search_input_box.send_keys(self._search_query, Keys.ENTER)

        ad_links = []

        try:
            wait = WebDriverWait(self._driver, timeout=10)
            results_loaded = wait.until(EC.presence_of_element_located((By.ID, "result-stats")))

            if results_loaded:
                logger.info("Getting ad links...")
                ad_links = self._get_ad_links()

        except TimeoutException:
            logger.error("Timed out waiting for results!")
            self.end_search()

        return ad_links

    def click_ads(self, ads):
        """
        :Click ads found
        :type ads: list
        :param ads: List of (ad, ad_link) tuples
        """

        # store the ID of the original window
        original_window_handle = self._driver.current_window_handle

        for ad in ads:
            ad_link_element = ad[0]
            ad_link = ad[1]
            logger.info(f"Clicking {ad_link}...")

            # open link in a different tab
            ad_link_element.send_keys(Keys.CONTROL + Keys.RETURN)

            for window_handle in self._driver.window_handles:
                if window_handle != original_window_handle:
                    self._driver.switch_to.window(window_handle)
                    sleep(self._ad_visit_time)
                    self._driver.close()
                    break

            # go back to original window
            self._driver.switch_to.window(original_window_handle)
            sleep(1)

            # scroll the page to avoid elements remain outside of the view
            self._driver.execute_script("arguments[0].scrollIntoView(true);", ad_link_element)

    def end_search(self):
        """Close the browser"""

        self._driver.quit()

通过cli运行时会遇到的错误:错误

$ python3 ad_clicker.py -q "123"
Traceback (most recent call last):
File "/home/slycooper/Documents/Coding/Ad_clicker/search_controller.py", line 28, in __init__
    self._driver = self.create_driver(browser.lower())
AttributeError: 'SearchController' object has no attribute 'create_driver'

I have a file named search_controller.py.When I run the search_controller.py file am getting
an error.I want the file to open up firefox browser and search the query passed to it.

The error:

AttributeError: 'SearchController' object has no attribute 'create_driver'

Below is the code:

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import FirefoxProfile, ChromeOptions
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from time import sleep
from webdriver_setup import get_webdriver_for
from config import logger
from translations import contains_ad


class SearchController:

    URL = "https://www.google.com"
    SEARCH_INPUT = (By.NAME, "q")

    def __init__(self, query, browser="firefox", ad_visit_time=4):

        self._search_query = query
        self._ad_visit_time = ad_visit_time

        self._driver = self._create_driver(browser.lower())
        self._load()

    def search_for_ads(self):
        """
        :Start search for the given query and return ads if any
        :rtype: list
        :returns: List of (ad, ad_link) tuples
        """

        logger.info(f"Starting search for '{self._search_query}'")

        search_input_box = self._driver.find_element(*self.SEARCH_INPUT)
        search_input_box.send_keys(self._search_query, Keys.ENTER)

        ad_links = []

        try:
            wait = WebDriverWait(self._driver, timeout=10)
            results_loaded = wait.until(EC.presence_of_element_located((By.ID, "result-stats")))

            if results_loaded:
                logger.info("Getting ad links...")
                ad_links = self._get_ad_links()

        except TimeoutException:
            logger.error("Timed out waiting for results!")
            self.end_search()

        return ad_links

    def click_ads(self, ads):
        """
        :Click ads found
        :type ads: list
        :param ads: List of (ad, ad_link) tuples
        """

        # store the ID of the original window
        original_window_handle = self._driver.current_window_handle

        for ad in ads:
            ad_link_element = ad[0]
            ad_link = ad[1]
            logger.info(f"Clicking {ad_link}...")

            # open link in a different tab
            ad_link_element.send_keys(Keys.CONTROL + Keys.RETURN)

            for window_handle in self._driver.window_handles:
                if window_handle != original_window_handle:
                    self._driver.switch_to.window(window_handle)
                    sleep(self._ad_visit_time)
                    self._driver.close()
                    break

            # go back to original window
            self._driver.switch_to.window(original_window_handle)
            sleep(1)

            # scroll the page to avoid elements remain outside of the view
            self._driver.execute_script("arguments[0].scrollIntoView(true);", ad_link_element)

    def end_search(self):
        """Close the browser"""

        self._driver.quit()

Error I get when I run it via CLI:

$ python3 ad_clicker.py -q "123"
Traceback (most recent call last):
File "/home/slycooper/Documents/Coding/Ad_clicker/search_controller.py", line 28, in __init__
    self._driver = self.create_driver(browser.lower())
AttributeError: 'SearchController' object has no attribute 'create_driver'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文