From 50162ba9966e79dead3761af634d902b2ec73500 Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot <378351+weskerfoot@users.noreply.github.com> Date: Wed, 30 Sep 2020 21:46:35 -0400 Subject: [PATCH] fix unliking (#134) --- deletefb/tools/common.py | 17 ++++++++++------ deletefb/tools/likes.py | 42 +++++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/deletefb/tools/common.py b/deletefb/tools/common.py index fd5db1b..621e865 100644 --- a/deletefb/tools/common.py +++ b/deletefb/tools/common.py @@ -20,13 +20,20 @@ SELENIUM_EXCEPTIONS = ( TimeoutException ) - def click_button(driver, el): """ Click a button using Javascript """ driver.execute_script("arguments[0].click();", el) +def scroll_until_element_exists(driver, xpath_expr): + while True: + driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") + try: + element = driver.find_element_by_xpath(xpath_expr) + except SELENIUM_EXCEPTIONS: + continue + break def scroll_to(driver, el): """ @@ -37,7 +44,6 @@ def scroll_to(driver, el): except SELENIUM_EXCEPTIONS: return - def logger(name): """ Args: @@ -57,12 +63,11 @@ def logger(name): logging.config.dictConfig(config["logging"]) return logging.getLogger(name) - -def wait_xpath(driver, expr): +def wait_xpath(driver, expr, timeout=20): """ - Takes an XPath expression, and waits at most 20 seconds until it exists + Takes an XPath expression, and waits at most `timeout` seconds until it exists """ - wait = WebDriverWait(driver, 20) + wait = WebDriverWait(driver, timeout) try: wait.until(EC.presence_of_element_located((By.XPATH, expr))) except SELENIUM_EXCEPTIONS: diff --git a/deletefb/tools/likes.py b/deletefb/tools/likes.py index 091a144..a90f44f 100644 --- a/deletefb/tools/likes.py +++ b/deletefb/tools/likes.py @@ -1,6 +1,6 @@ from .archive import archiver from ..types import Page -from .common import SELENIUM_EXCEPTIONS, logger, click_button +from .common import SELENIUM_EXCEPTIONS, logger, click_button, wait_xpath, force_mobile, scroll_to, scroll_until_element_exists from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait @@ -18,17 +18,25 @@ def load_likes(driver, profile_url): None """ - driver.get("{0}/likes_all".format(profile_url)) + likes_link_xpath = "//div[normalize-space(text())='Likes']/../..//a[contains(@href, 'app_section')]" - wait = WebDriverWait(driver, 20) + all_likes_link_xpath = "//div[normalize-space(text())='All Likes']/../../../..//a[contains(@href, 'app_collection')]" - try: - wait.until( - EC.presence_of_element_located((By.CSS_SELECTOR, ".PageLikeButton")) - ) - except SELENIUM_EXCEPTIONS: - LOG.exception("Traceback of load_likes") - return + driver.get(force_mobile("{0}/about".format(profile_url))) + + scroll_until_element_exists(driver, "//div[text()='Likes']") + + likes_link_el = driver.find_element_by_xpath(likes_link_xpath) + + driver.get(likes_link_el.get_attribute("href")) + + wait_xpath(driver, all_likes_link_xpath) + + all_likes_link_el = driver.find_element_by_xpath(all_likes_link_xpath) + + all_likes_link = all_likes_link_el.get_attribute("href") + + driver.get(all_likes_link) def get_page_links(driver): """ @@ -39,8 +47,7 @@ def get_page_links(driver): Returns: List of URLs to pages """ - pages = driver.find_elements_by_xpath("//li//div/div/a[contains(@class, 'lfloat')]") - + pages = driver.find_elements_by_xpath("//header/..//a") return [page.get_attribute("href").replace("www", "mobile") for page in pages] def unlike_page(driver, url, archive=None): @@ -60,7 +67,7 @@ def unlike_page(driver, url, archive=None): print("Unliking {0}".format(url)) - wait = WebDriverWait(driver, 20) + wait = WebDriverWait(driver, 5) try: wait.until( @@ -70,19 +77,14 @@ def unlike_page(driver, url, archive=None): # Something went wrong with this page, so skip it return - button = driver.find_element_by_xpath("//*[text()='Liked']") - - # Click the "Liked" button to open up "Unlike" - click_button(driver, button) + driver.find_element_by_xpath("//*[text()='Liked']/../../../..").click() wait.until( EC.presence_of_element_located((By.XPATH, "//*[text()='Unlike']")) ) # There should be an "Unlike" button now, click it - unlike_button = driver.find_element_by_xpath("//*[text()='Unlike']/..") - - click_button(driver, unlike_button) + driver.find_element_by_xpath("//*[text()='Unlike']/..").click() if archive: archive(Page(name=url))