[+] Get availability
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user