class RemoteDriverCase(object):
    logger = logging_setting.get_logger()

    def save_info(self, system_name, url):
        driver = browser_engine.init_driver(url)
        city_name = ""
        self.logger.debug("开始保存房屋费用信息~~")
        self.logger.info("正在使用 {} 上的 Chrome 浏览器进行测试".format(system_name))
        # 登陆
        houses_login_page = HouseLoginPage(driver)
        houses_login_page.get_login_page(USERNAME, PASSWORD)
        # 获取筛选后的房屋列表
        houses_list_page = HousesListPage(driver)
        if system_name == "linux":
            city_name = "深圳"
        elif system_name == "windows":
            city_name = "广州"

        houses_list_page.get_houses_list_driver("exchange", city_name, "租房")
        self.logger.info("正在访问 {} 的租房信息".format(city_name))

        rent_type_locator = (By.LINK_TEXT, "合租")
        price_range_locator = (By.LINK_TEXT, "1000-1500元")
        newest_locator = (By.LINK_TEXT, "最新上架")
        houses_list_page.get_selector_page(
            [rent_type_locator, price_range_locator, newest_locator])
        self.logger.debug("得到筛选后的页面~~")

        houses_locator = (
            By.XPATH, "//div[@class='content__list']//div[1]//a[1]//img[1]")
        driver = houses_list_page.get_houses_info_page(houses_locator)
        self.logger.info("当前房屋信息的 url 地址是:{}".format(driver.current_url))
        # 保存房屋费用信息到数据库中
        try:
            houses_info = HousesInfoPage(driver)
            houses_info.save_product_info()
            self.logger.info("保存商品信息成功~")
            return True
        except:
            return False
        finally:
            # 关闭浏览器
            time.sleep(3)
            driver.quit()
class RemoteDriverCase(object):
    # driver = browser_engine.init_local_driver()
    logger = logging_setting.get_logger()

    def __init__(self):
        driver_dict = browser_engine.init_remote_driver()
        self.driver = driver_dict["linux"]

    def save_info(self):
        self.logger.debug("开始保存房屋费用信息~~")
        # 登陆
        houses_login_page = HouseLoginPage(self.driver)
        houses_login_page.get_login_page(USERNAME, PASSWORD)
        # 获取筛选后的房屋列表
        houses_list_page = HousesListPage(self.driver)
        houses_list_page.get_houses_list_driver("exchange", "深圳", "租房")

        rent_type_locator = (By.LINK_TEXT, "合租")
        price_range_locator = (By.LINK_TEXT, "1000-1500元")
        newest_locator = (By.LINK_TEXT, "最新上架")
        houses_list_page.get_selector_page(
            [rent_type_locator, price_range_locator, newest_locator])
        self.logger.debug("得到筛选后的页面~~")

        houses_locator = (
            By.XPATH, "//div[@class='content__list']//div[1]//a[1]//img[1]")
        driver = houses_list_page.get_houses_info_page(houses_locator)
        self.logger.info("当前房屋信息的 url 地址是:{}".format(driver.current_url))
        # 保存房屋费用信息到数据库中
        try:
            houses_info = HousesInfoPage(driver)
            houses_info.save_product_info()
            self.logger.info("保存商品信息成功~")
            return True
        except:
            return False
        finally:
            # 关闭浏览器
            time.sleep(3)
            driver.quit()
Ejemplo n.º 3
0
class HousesInfoPage(BasePage):
    logger = get_logger()

    def __init__(self, driver):
        self._driver = driver
        super().__init__(driver, basic_config.START_URL)

    def save_product_info(self):
        js = "window.scrollTo(0, 100)"
        self._driver.execute_script(js)
        # 定位到费用详情
        price_element = (
            By.XPATH,
            "/html[1]/body[1]/div[3]/div[1]/div[3]/div[3]/ul[1]/li[3]")
        self.find_element(*price_element).click()
        info_ele = (By.CLASS_NAME, "cost_content")
        info_elements = self.find_elements(*info_ele)

        result_list = []
        for info_element in info_elements:
            info_element_dict = self.__get_info_element_dict(info_element)
            result_list.append(info_element_dict)
        self.__save_info_to_mysql(result_list)

    def __get_info_element_dict(self, info_element):

        # 房屋费用表标题
        price_part_element = (By.CLASS_NAME, "title_info")
        price_part = self.find_element(*price_part_element,
                                       element=info_element)
        # 房屋费用表第一行的值,作为字典的 key
        price_first_element = (By.CLASS_NAME, "table_title")
        price_first = self.find_element(*price_first_element,
                                        element=info_element)
        price_first_keys_element = (By.TAG_NAME, "li")
        price_first_keys = self.find_elements(*price_first_keys_element,
                                              element=price_first)
        # 房屋费用表第二行的值,作为字典的 value
        price_second_element = (By.CLASS_NAME, "table_content")
        price_second = self.find_element(*price_second_element,
                                         element=info_element)
        price_second_values_element = (By.TAG_NAME, "li")
        price_second_values = self.find_elements(*price_second_values_element,
                                                 element=price_second)

        self.logger.debug("获取到所有的费用信息")

        key_and_value_dict = {}
        parts_dict = {}

        for i in range(len(price_first_keys)):
            price_key = price_first_keys[i].text.split("<span")[0]
            price_value = price_second_values[i].text
            key_and_value_dict[price_key] = price_value

        parts_dict[price_part.text] = key_and_value_dict

        return parts_dict

    def __save_info_to_mysql(self, info_list):
        houses = House_Info()
        for info in info_list:
            for key, value in info.items():
                houses.insert(["price_part", "price_info"],
                              [str(key), str(value)])
Ejemplo n.º 4
0
class HousesListPage(BasePage):
    logger = get_logger()

    def __init__(self, driver):
        self._driver = driver
        super().__init__(driver, basic_config.START_URL)

    def get_houses_list_driver(self, first_list_name, second_list_name,
                               third_list_name):
        """
        获取房屋信息列表
        :param first_list_name: 第一个元素的关键字
        :param second_list_name: 第二个元素的关键字
        :param third_list_name: 第三个元素的关键字
        :return: 浏览器的 driver
        """
        driver = self.open()
        first_element = (By.CLASS_NAME, first_list_name)
        second_element = (By.LINK_TEXT, second_list_name)
        third_element = (By.LINK_TEXT, third_list_name)

        first = self.find_element(*first_element)
        first.click()

        second = self.find_element(*second_element)
        second.click()

        third = self.find_element(*third_element)
        third.click()

        # 切换句柄
        handles = driver.window_handles
        index_handle = driver.current_window_handle
        for handle in handles:
            if handle != index_handle:
                driver.close()
                driver.switch_to.window(handle)

        self.logger.info("获取到页面:" + second_list_name)
        self.logger.info("当前 url 是:" + driver.current_url)

        self._driver = driver
        return driver

    def get_selector_page(self, selector_condition_list):
        """
        获取筛选后的页面
        :param selector_condition_list: 筛选条件列表,格式:[(By.ID, "id_value"), (By.NAME, "name_value")]
        :return:
        """
        for condition in selector_condition_list:
            element = self.find_element(*condition)
            element.click()

    def get_houses_info_page(self, selector_condition):
        """
        获取房屋信息页面
        :param selector_condition: 具体商品的筛选条件,格式:(By.ID, "id_value")
        :return: 页面的 driver
        """
        self.find_element(*selector_condition).click()

        # 切换句柄
        handles = self._driver.window_handles
        index_handle = self._driver.current_window_handle
        for handle in handles:
            if handle != index_handle:
                self._driver.close()
                self._driver.switch_to.window(handle)

        return self._driver
class HouseLoginPage(BasePage):
    logger = get_logger()

    def __init__(self, driver):
        self._driver = driver
        super().__init__(driver, basic_config.START_URL)

    def get_login_page(self, username, password):
        """
        获取登录页面
        :param username: 用户名
        :param password: 密码
        :return: 返回 浏览器 driver
        """
        self.logger.info("用户 {} 正在登陆~".format(username))
        driver = self.open()
        login_button_element = (By.CLASS_NAME, "reg")
        change_type_element = (By.CLASS_NAME, "change_login_type")
        username_element = (By.CLASS_NAME, "phonenum_input")
        password_element = (By.CLASS_NAME, "password_input")
        submit_element = (By.CLASS_NAME, "confirm_btn ")
        # 点击首页登陆按钮
        login_button = self.find_element(*login_button_element)
        login_button.click()
        # 点击切换使用 账户密码 登陆
        change_type = self.find_element(*change_type_element)
        change_type.click()
        # 输入 用户名
        username_ele = self.find_element(*username_element)
        username_ele.send_keys(username)
        # 输入 密码
        password_ele = self.find_element(*password_element)
        password_ele.send_keys(password)
        # 点击登录按钮
        submit = self.find_element(*submit_element)
        time.sleep(1)
        submit.click()

        # 验证是否登陆成功
        self.check_login(username)

        # 切换句柄
        handles = driver.window_handles
        index_handle = driver.current_window_handle
        for handle in handles:
            if handle != index_handle:
                driver.close()
                driver.switch_to.window(handle)

        self._driver = driver
        return driver

    def check_login(self, username):
        """
        验证用户是否登陆成功
        :param username: 用户名
        :return:
        """
        quit_element = (By.LINK_TEXT, "退出")
        try:
            # 通过页面上是否有退出连接判断是否登陆成功
            quit_ele = self.find_element(*quit_element)
            if quit_ele:
                self.logger.info("用户 {} 登陆成功~".format(username))
        except:
            self.logger.info("用户 {} 登陆失败~".format(username))