def authenticate_webdriver( self, driver: WebDriver, user: "******", ) -> WebDriver: """ Default AuthDriverFuncType type that sets a session cookie flask-login style :return: The WebDriver passed in (fluent) """ # Short-circuit this method if we have an override configured if self._auth_webdriver_func_override: return self._auth_webdriver_func_override(driver, user) # Setting cookies requires doing a request first driver.get(headless_url("/login/")) if user: cookies = self.get_auth_cookies(user) elif request.cookies: cookies = request.cookies else: cookies = {} for cookie_name, cookie_val in cookies.items(): driver.add_cookie(dict(name=cookie_name, value=cookie_val)) return driver
class CookieTest(unittest.TestCase): """Cookie test for the json webdriver protocol""" def setUp(self): self._launcher = ChromeDriverLauncher(root_path=os.path.dirname(__file__)) self._driver = WebDriver(self._launcher.GetURL(), DesiredCapabilities.CHROME) def tearDown(self): self._driver.quit() self._launcher.Kill() def testAddCookie(self): self._driver.get(self._launcher.GetURL() + '/test_page.html') cookie_dict = None cookie_dict = self._driver.get_cookie("chromedriver_cookie_test") cookie_dict = {} cookie_dict["name"]= "chromedriver_cookie_test" cookie_dict["value"] = "this is a test" self._driver.add_cookie(cookie_dict) cookie_dict = self._driver.get_cookie("chromedriver_cookie_test") self.assertNotEqual(cookie_dict, None) self.assertEqual(cookie_dict["value"], "this is a test") def testDeleteCookie(self): self.testAddCookie(); self._driver.delete_cookie("chromedriver_cookie_test") cookie_dict = self._driver.get_cookie("chromedriver_cookie_test") self.assertEqual(cookie_dict, None)
def use_cookies_login(driver: WebDriver): """加载wxcookies.pickle文件中的cookies信息,进入登陆状态""" driver.get('https://work.weixin.qq.com/wework_admin/frame#index') with open('../data/wxcookies.pickle', 'rb') as cookies_file: cookies = pickle.load(cookies_file) for i in cookies: if i.get('name') in ['wwrtx.refid', 'wwrtx.ref', 'wwrtx.i18n_lan']: continue driver.add_cookie(i)
def auth_driver(driver: WebDriver, user: "******") -> WebDriver: """ Default AuthDriverFuncType type that sets a session cookie flask-login style :return: WebDriver """ if user: # Set the cookies in the driver for cookie in get_auth_cookies(user): info = dict(name="session", value=cookie) driver.add_cookie(info) elif request.cookies: cookies = request.cookies for k, v in cookies.items(): cookie = dict(name=k, value=v) driver.add_cookie(cookie) return driver
def close_privacy_popup(driver: WebDriver) -> None: """YouTube shows a cookie/privacy disclaimer on the first visit which prevents any other action. This functions sets the CONSENT cookie before visiting YouTube. """ # To set cookies we need to visit the domain first. To avoid visiting the real website too early, we use robots.txt # Originally for web crawlers, but serves as a plain page for any domain. # https://en.wikipedia.org/wiki/Robots_exclusion_standard driver.get("https://www.youtube.com/robots.txt") driver.add_cookie({ "name": "CONSENT", "value": "YES+US.en", "secure": True }) # YouTube will ask if the user wants to sign in on the first visit, clicking no thanks is easy enough driver.get("https://www.youtube.com/") try: no_thanks_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable(( By.CSS_SELECTOR, 'tp-yt-paper-button[aria-label^="No"][aria-label$="thanks"]'))) no_thanks_btn.click() except: logging.warning("No login pop up found by close_privacy_popup")
def login_using_cookie_file(driver: WebDriver, cookie_file: str): """Restore auth cookies from a file. Does not guarantee that the user is logged in afterwards. Visits the domains specified in the cookies to set them, the previous page is not restored.""" domain_cookies: Dict[str, List[object]] = {} with open(cookie_file) as file: cookies: List = json.load(file) # Sort cookies by domain, because we need to visit to domain to add cookies for cookie in cookies: try: domain_cookies[cookie["domain"]].append(cookie) except KeyError: domain_cookies[cookie["domain"]] = [cookie] for domain, cookies in domain_cookies.items(): driver.get(domain_to_url(domain + "/robots.txt")) for cookie in cookies: cookie.pop("sameSite", None) # Attribute should be available in Selenium >4 cookie.pop("storeId", None) # Firefox container attribute try: driver.add_cookie(cookie) except: print(f"Couldn't set cookie {cookie['name']} for {domain}")
def run(driver: WebDriver): nonlocal no if not no: elem = driver.find_element(By.XPATH, "//a[text()='投票']") if not elem: elem = driver.find_element(By.XPATH, "//a[text()='今日已投票']") if elem: driver.delete_all_cookies() driver.refresh() return None elem.click() elem_container = driver.find_element_by_class_name( "modal__container") if elem_container.is_displayed(): no += 1 return elem_container elif no == 1: elem_vote_options = driver.find_elements( By.XPATH, "//div/div/label[@class='label']") if not elem_vote_options: return None for elem in elem_vote_options: if not elem.is_displayed(): break elem.click() for_input = driver.find_element_by_id( elem.get_attribute("for")) if not for_input.is_selected(): break else: no += 1 return elem_vote_options if no == 2: driver.add_cookie({ "name": "uuid", "value": generate_uuid(), "domain": ".businessweekly.com.tw", "size": 40, }) elem = None try: elem = driver.find_element(By.XPATH, r"//a[text()='確認送出']") if elem and elem.is_enabled(): elem.click() except Exception as e: if driver.find_element_by_id("gdrp-el"): driver.execute_script( """document.getElementById("gdrp-el").remove();""") finally: elem_container = driver.find_element_by_class_name( "modal__container") if elem_container and elem_container.find_element( By.XPATH, "//img[@alt='投票完成']"): no += 1 return True if "投票完成" in driver.page_source: no += 1 return True return None