def sign_in(self): log.info("Signing in.") self.driver.get( f"https://store.nvidia.com/DRHM/store?Action=Logout&SiteID=nvidia&Locale={self.locale}&ThemeID=326200&Env=BASE&nextAction=help" ) selenium_utils.wait_for_page( self.driver, PAGE_TITLES_BY_LOCALE[self.locale]["signed_in_help"]) if not self.is_signed_in(): email = selenium_utils.wait_for_element(self.driver, "loginEmail") pwd = selenium_utils.wait_for_element(self.driver, "loginPassword") email.send_keys(self.nvidia_login) pwd.send_keys(self.nvidia_password) try: action = ActionChains(self.driver) button = self.driver.find_element_by_xpath( '//*[@id="dr_siteButtons"]/input') action.move_to_element(button).click().perform() WebDriverWait(self.driver, 5).until(ec.staleness_of(button)) except NoSuchElementException: log.error("Error signing in.")
def selenium_checkout(self): log.info("Checking out.") autobuy_btns = autobuy_locale_btns[self.locale] params = {"token": self.access_token} url = furl(DIGITAL_RIVER_CHECKOUT_URL).set(params) self.driver.get(url.url) log.debug( f"Waiting for page title: {PAGE_TITLES_BY_LOCALE[self.locale]['checkout']}" ) selenium_utils.wait_for_page( self.driver, PAGE_TITLES_BY_LOCALE[self.locale]["checkout"]) log.info("Next.") log.debug(f"Clicking on button: {autobuy_btns[0]}") self.driver.find_element_by_xpath( f'//*[@value="{autobuy_btns[0]}"]').click() log.debug(f"Entering security code to 'cardSecurityCode'") security_code = selenium_utils.wait_for_element( self.driver, "cardSecurityCode") security_code.send_keys(self.cvv) log.info("Next.") log.debug(f"Clicking on button: {autobuy_btns[0]}") self.driver.find_element_by_xpath( f'//*[@value="{autobuy_btns[0]}"]').click() try: log.debug( f"Waiting for page title: {PAGE_TITLES_BY_LOCALE[self.locale]['verify_order']}" ) selenium_utils.wait_for_page( self.driver, PAGE_TITLES_BY_LOCALE[self.locale]["verify_order"], 5) except TimeoutException: log.debug("Address validation required?") self.address_validation_page() log.debug( f"Waiting for page title: {PAGE_TITLES_BY_LOCALE[self.locale]['verify_order']}" ) selenium_utils.wait_for_page( self.driver, PAGE_TITLES_BY_LOCALE[self.locale]["verify_order"], 5) if not self.test: log.info("F this captcha lmao. Submitting cart.") self.submit_cart() else: log.info("Test complete. No actual purchase was made.")
def is_logged_in(self): try: text = wait_for_element(self.driver, "nav-link-accountList").text return "Hello, Sign in" not in text except Exception: return False
def buy(self, delay=5, test=False, model=""): selector = '//a[@id="LFrame_btnAddToCart"]' associate_code = "&associatecode=2QME1VF65K9ZY8B" if test: model_name = "test" url = "https://www.evga.com/products/product.aspx?pn=08G-P4-3289-KR" self.driver.get(url + associate_code) selenium_utils.wait_for_page( self.driver, "EVGA - Products - EVGA GeForce RTX 2080 SUPER FTW3 HYDRO COPPER GAMING, 08G-P4-3289-KR, 8GB GDDR6, RGB LED, iCX2 Technology, Metal Backplate - 08G-P4-3289-KR", ) else: models = { "ftw3": [ "https://www.evga.com/products/product.aspx?pn=10G-P5-3895-KR", "EVGA - Products - EVGA GeForce RTX 3080 FTW3 GAMING, 10G-P5-3895-KR, 10GB GDDR6X, iCX3 Technology, ARGB LED, Metal Backplate - 10G-P5-3895-KR", ], "xc3": [ "https://www.evga.com/products/product.aspx?pn=10G-P5-3883-KR", "EVGA - Products - EVGA GeForce RTX 3080 XC3 GAMING, 10G-P5-3883-KR, 10GB GDDR6X, iCX3 Cooling, ARGB LED, Metal Backplate - 10G-P5-3883-KR", ], "xc3ultra": [ "https://www.evga.com/products/product.aspx?pn=10G-P5-3885-KR", "EVGA - Products - EVGA GeForce RTX 3080 XC3 ULTRA GAMING, 10G-P5-3885-KR, 10GB GDDR6X, iCX3 Cooling, ARGB LED, Metal Backplate - 10G-P5-3885-KR", ], "xc3black": [ "https://www.evga.com/products/product.aspx?pn=10G-P5-3881-KR", "EVGA - Products - EVGA GeForce RTX 3080 XC3 BLACK GAMING, 10G-P5-3881-KR, 10GB GDDR6X, iCX3 Cooling, ARGB LED - 10G-P5-3881-KR", ], "ftw3ultra": [ "https://www.evga.com/products/product.aspx?pn=10G-P5-3897-KR", "EVGA - Products - EVGA GeForce RTX 3080 FTW3 ULTRA GAMING, 10G-P5-3897-KR, 10GB GDDR6X, iCX3 Technology, ARGB LED, Metal Backplate - 10G-P5-3897-KR", ], "any": [ "https://www.evga.com/products/productlist.aspx?type=0&family=GeForce+30+Series+Family&chipset=RTX+3080", "EVGA - Products - Graphics - GeForce 30 Series Family - RTX 3080", ], } if model: self.driver.get(models[model][0] + associate_code) selenium_utils.wait_for_page(self.driver, models[model][1]) else: model = "any" selector = '//input[@class="btnBigAddCart"]' self.driver.get(models["any"][0] + associate_code) selenium_utils.wait_for_page(self.driver, models["any"][1]) # Check for stock log.info("On GPU Page") atc_buttons = self.driver.find_elements_by_xpath(selector) while not atc_buttons: if self.driver.current_url == models[model][0] + associate_code: log.debug("Refreshing page for " + model) self.driver.refresh() else: log.debug("Error page detected. Redirecting...") self.driver.get(models[model][0] + associate_code) atc_buttons = self.driver.find_elements_by_xpath(selector) sleep(delay) # send notification self.notification_handler.send_notification( f"EVGA BOT: " + model_name + " in stock! Attempting to place order...") # Add to cart atc_buttons[0].click() # Go to checkout selenium_utils.wait_for_page(self.driver, "EVGA - Checkout") selenium_utils.button_click_using_xpath( self.driver, '//*[@id="LFrame_CheckoutButton"]') # Shipping Address screen selenium_utils.wait_for_page(self.driver, "Shopping") log.info("Skip that page.") self.driver.get("https://secure.evga.com/Cart/Checkout_Payment.aspx") selenium_utils.wait_for_page(self.driver, "EVGA - Checkout - Billing Options") log.info("Ensure that we are paying with credit card") sleep(1) # Fix this. WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.XPATH, './/input[@value="rdoCreditCard"]'))).click() WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.XPATH, '//*[@id="ctl00_LFrame_btncontinue"]'))).click() selenium_utils.wait_for_element(self.driver, "ctl00_LFrame_txtNameOnCard") log.info("Populate credit card fields") selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtNameOnCard", self.credit_card["name"]) selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtCardNumber", self.credit_card["number"]) selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtCvv", self.credit_card["cvv"]) Select(self.driver.find_element_by_id( "ctl00_LFrame_ddlMonth")).select_by_value( self.credit_card["expiration_month"]) Select(self.driver.find_element_by_id( "ctl00_LFrame_ddlYear")).select_by_value( self.credit_card["expiration_year"]) WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable(( By.XPATH, "/html/body/form/div[3]/div[3]/div/div[1]/div[5]/div[3]/div/div[1]/div/div[@id='checkoutButtons']/input[2]", ))).click() log.info("Finalize Order Page") selenium_utils.wait_for_page(self.driver, "EVGA - Checkout - Finalize Order") WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.ID, "ctl00_LFrame_cbAgree"))).click() selenium_utils.wait_for_element(self.driver, "ctl00_LFrame_btncontinue") if not test: WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.ID, "ctl00_LFrame_btncontinue"))).click() log.info("Finalized Order!")
def buy(self, delay=5, test=False): if test: log.info("Refreshing Page Until Title Matches ...") selenium_utils.wait_for_title( self.driver, "EVGA - Products - Graphics - GeForce 16 Series Family - GTX 1660", "https://www.evga.com/products/ProductList.aspx?type=0&family=GeForce+16+Series+Family&chipset=GTX+1660", ) else: log.info("Refreshing Page Until Title Matches ...") selenium_utils.wait_for_title( self.driver, "EVGA - Products - Graphics - GeForce 30 Series Family - RTX " + self.card_series, "https://www.evga.com/products/productlist.aspx?type=0&family=GeForce+30+Series+Family&chipset=RTX+" + self.card_series, ) log.info("matched chipset=RTX+" + self.card_series + "!") if self.card_pn and not test: # check for card log.info("On GPU list Page") card_btn = self.driver.find_elements_by_xpath( "//a[@href='/products/product.aspx?pn=" + self.card_pn + "']") while not card_btn: log.debug("Refreshing page for GPU") self.driver.refresh() card_btn = self.driver.find_elements_by_xpath( "//a[@href='/products/product.aspx?pn=" + self.card_pn + "']") sleep(delay) card_btn[0].click() # Check for stock log.info("On GPU Page") atc_buttons = self.driver.find_elements_by_xpath( '//input[@class="btnBigAddCart"]') while not atc_buttons: log.debug("Refreshing page for GPU") self.driver.refresh() atc_buttons = self.driver.find_elements_by_xpath( '//input[@class="btnBigAddCart"]') sleep(delay) # Add to cart atc_buttons[0].click() # Go to checkout selenium_utils.wait_for_page(self.driver, "EVGA - Checkout") selenium_utils.button_click_using_xpath( self.driver, '//*[@id="LFrame_CheckoutButton"]') # Shipping Address screen selenium_utils.wait_for_page(self.driver, "Shopping") log.info("Skip that page.") self.driver.get("https://secure.evga.com/Cart/Checkout_Payment.aspx") selenium_utils.wait_for_page(self.driver, "EVGA - Checkout - Billing Options") log.info("Ensure that we are paying with credit card") sleep(1) # Fix this. WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.XPATH, './/input[@value="rdoCreditCard"]'))).click() WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.XPATH, '//*[@id="ctl00_LFrame_btncontinue"]'))).click() selenium_utils.wait_for_element(self.driver, "ctl00_LFrame_txtNameOnCard") log.info("Populate credit card fields") selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtNameOnCard", self.credit_card["name"]) selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtCardNumber", self.credit_card["number"]) selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtCvv", self.credit_card["cvv"]) Select(self.driver.find_element_by_id( "ctl00_LFrame_ddlMonth")).select_by_value( self.credit_card["expiration_month"]) Select(self.driver.find_element_by_id( "ctl00_LFrame_ddlYear")).select_by_value( self.credit_card["expiration_year"]) WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable(( By.XPATH, "/html/body/form/div[3]/div[3]/div/div[1]/div[5]/div[3]/div/div[1]/div/div[@id='checkoutButtons']/input[2]", ))).click() try: WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable(( By.XPATH, "/html/body/form/div[3]/div[3]/div/div[1]/div[5]/div[3]/div/div[1]/div/div[@id='checkoutButtons']/input[2]", ))).click() except: pass log.info("Finalize Order Page") selenium_utils.wait_for_page(self.driver, "EVGA - Checkout - Finalize Order") WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.ID, "ctl00_LFrame_cbAgree"))).click() if not test: WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.ID, "ctl00_LFrame_btncontinue"))).click() log.info("Finalized Order!")
def buy(self, delay=5, test=False): if test: self.driver.get( "https://www.evga.com/products/product.aspx?pn=10G-P5-3897-KR&associatecode=2QME1VF65K9ZY8B" ) selenium_utils.wait_for_page( self.driver, "EVGA - Products - EVGA GeForce RTX 3080 FTW3 ULTRA GAMING, 10G-P5-3897-KR, 10GB GDDR6X, iCX3 Technology, ARGB LED, Metal Backplate - 10G-P5-3897-KR" ) else: self.driver.get( "https://www.evga.com/products/product.aspx?pn=10G-P5-3897-KR&associatecode=2QME1VF65K9ZY8B" ) selenium_utils.wait_for_page( self.driver, "EVGA - Products - EVGA GeForce RTX 3080 FTW3 ULTRA GAMING, 10G-P5-3897-KR, 10GB GDDR6X, iCX3 Technology, ARGB LED, Metal Backplate - 10G-P5-3897-KR", ) #Check for stock log.info("On GPU Page") atc_buttons = self.driver.find_elements_by_xpath( '//input[@class="btnBigAddCart"]') while not atc_buttons: log.info("Refreshing GPU and checking for add to cart button") # self.driver.refresh() self.driver.get( "https://www.evga.com/products/product.aspx?pn=10G-P5-3897-KR&associatecode=2QME1VF65K9ZY8B" ) atc_buttons = self.driver.find_elements_by_xpath( '//input[@class="btnBigAddCart"]') sleep(3) # # Add to cart # atc_buttons[0].click() selenium_utils.button_click_using_xpath( self.driver, '//*[@id="LFrame_btnAddToCart"]') # Go to checkout selenium_utils.wait_for_page(self.driver, "EVGA - Checkout") selenium_utils.button_click_using_xpath( self.driver, '//*[@id="LFrame_CheckoutButton"]') # Shipping Address screen selenium_utils.wait_for_page(self.driver, "Shopping") log.info("Skip that page.") self.driver.get("https://secure.evga.com/Cart/Checkout_Payment.aspx") selenium_utils.wait_for_page(self.driver, "EVGA - Checkout - Billing Options") log.info("Ensure that we are paying with credit card") WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.XPATH, './/input[@value="rdoCreditCard"]'))).click() WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.XPATH, '//*[@id="ctl00_LFrame_btncontinue"]'))).click() selenium_utils.wait_for_element(self.driver, "ctl00_LFrame_txtNameOnCard") log.info("Populate credit card fields") selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtNameOnCard", self.credit_card["name"]) selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtCardNumber", self.credit_card["number"]) selenium_utils.field_send_keys(self.driver, "ctl00$LFrame$txtCvv", self.credit_card["cvv"]) Select(self.driver.find_element_by_id( "ctl00_LFrame_ddlMonth")).select_by_value( self.credit_card["expiration_month"]) Select(self.driver.find_element_by_id( "ctl00_LFrame_ddlYear")).select_by_value( self.credit_card["expiration_year"]) WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable(( By.XPATH, "/html/body/form/div[3]/div[3]/div/div[1]/div[5]/div[3]/div/div[1]/div/div[@id='checkoutButtons']/input[2]", ))).click() log.info("Finalize Order Page") selenium_utils.wait_for_page(self.driver, "EVGA - Checkout - Finalize Order") WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.ID, "ctl00_LFrame_cbAgree"))).click() selenium_utils.wait_for_element(self.driver, "ctl00_LFrame_btncontinue") if not test: WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.ID, "ctl00_LFrame_btncontinue"))).click() selenium_utils.wait_for_page(self.driver, "EVGA - Checkout - Order Successful") log.info("Finalized Order!")
def is_logged_in(self): try: text = wait_for_element(self.driver, "nav-link-accountList").text return not any(sign_in in text for sign_in in SIGN_IN_TEXT) except Exception: return False