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()
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)])
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))