From b1263c84af439456396a806519c7971ed3393836 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Thu, 3 Mar 2022 01:28:35 -0500 Subject: [PATCH] [+] Get availability --- src/bestbuy_utils.py | 51 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/bestbuy_utils.py diff --git a/src/bestbuy_utils.py b/src/bestbuy_utils.py new file mode 100644 index 0000000..a3c81c3 --- /dev/null +++ b/src/bestbuy_utils.py @@ -0,0 +1,51 @@ +import math +from dataclasses import dataclass +from html import unescape +from urllib.parse import unquote + +from selenium.webdriver import Chrome +from selenium.webdriver.chrome.webdriver import WebDriver +from selenium.webdriver.common.by import By + +from utils import CSS + + +@dataclass +class AvailableStore: + loc: str + avail: str + n: int + + +def get_availability(browser: WebDriver, url: str): + browser.get(url) + + # Get stores element + stores = browser.find_elements(CSS, '.x-nearby-stores > *') + + # Filter stores, not 'check other stores' button + stores = [s for s in stores if not s.get_attribute('data-automation')] + + # Filter stores that are available + stores = [s for s in stores if len(s.find_elements(CSS, '[data-automation="store-availability-checkmark"]'))] + + if not stores: + return [] + + # Get availability + result = [] + for store in stores: + loc = unescape(store.find_element(CSS, '[data-automation="pickup-store-list-item-store-name"]').get_attribute('innerHTML').strip()) + avail = store.find_elements(By.XPATH, '//*[@data-automation="pickup-store-list-item-reserve-button"]/following-sibling::span/following-sibling::span') + + if not avail: + avail = 'Available' + n = 100 + else: + avail = unescape(avail[0].get_attribute('innerHTML').strip()) + n = [int(s) for s in avail.split() if s.isdigit()][0] + + result.append(AvailableStore(loc, avail, n)) + + return result +