Skip to content

Instantly share code, notes, and snippets.

@adamlwgriffiths
Created June 1, 2017 23:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adamlwgriffiths/0db58522186ebc301d43173e808be8be to your computer and use it in GitHub Desktop.
Save adamlwgriffiths/0db58522186ebc301d43173e808be8be to your computer and use it in GitHub Desktop.
Selenium test for issue #2214
from __future__ import absolute_import
from contextlib import contextmanager
from random import choice
from urlparse import urljoin
import traceback
import re
import time
import numpy
import ujson as json
import os
import sys
from xvfbwrapper import Xvfb
from splinter import Browser
DOMAIN = "https://ashs-snack-shack.myshopify.com"
SHOP_PASSWORD = 'ashssnackshack'
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
VISIT_SLEEP = 5.0
PURCHASE_STEP_SLEEP = 2.0
CC_SPINNER_SLEEP = 15.0
CRASH = True
@contextmanager
def xvfb():
xvfb = Xvfb()
xvfb.start()
yield
xvfb.stop()
with xvfb():
# create chrome browser
browser = Browser('chrome', user_agent=USER_AGENT)
browser.cookies.delete()
try:
print 'Home page'
browser.visit(DOMAIN)
time.sleep(VISIT_SLEEP)
# login
print 'Logging in'
x = browser.find_link_by_href("#LoginModal")
if x:
browser.click_link_by_href("#LoginModal")
browser.fill("password", SHOP_PASSWORD)
button = browser.find_by_value('Enter')
button.click()
time.sleep(VISIT_SLEEP)
else:
print 'No login modal'
# purchase product
print 'Visit product'
browser.visit(urljoin(DOMAIN, '/products/m0jt3mlt'))
time.sleep(VISIT_SLEEP)
print 'Add to cart'
button = browser.find_by_id("AddToCart").first
button.click()
time.sleep(VISIT_SLEEP)
# purchase
print 'Go to cart'
browser.visit(urljoin(DOMAIN, '/cart'))
time.sleep(VISIT_SLEEP)
# exceptions here indicate the cart is empty
# which means the AddToCart click failed
print 'Checkout'
button = browser.find_by_css('button[name="checkout"]').first
button.click()
time.sleep(PURCHASE_STEP_SLEEP)
#if browser.is_element_present_by_text('Customer information'):
if browser.is_element_present_by_css('.step[data-step="contact_information"]'):
print "Filling out 'Customer information' form"
browser.fill("checkout[email]", "sherlock@holmes.com")
browser.fill("checkout[billing_address][first_name]", "Sherlock")
browser.fill("checkout[billing_address][last_name]", "Holmes")
browser.fill("checkout[billing_address][address1]", "221b Baker St")
browser.fill("checkout[billing_address][city]", "London")
browser.select('checkout[billing_address][country]', 'United Kingdom')
browser.fill("checkout[billing_address][zip]", "NW1 6XE")
button = browser.find_by_css("button[type='submit']").first
button.click()
time.sleep(PURCHASE_STEP_SLEEP)
else:
print "No 'Customer information' form"
#if browser.is_element_present_by_text('Customer information'):
if browser.is_element_present_by_css('.step[data-step="shipping_method"]'):
print "Submitting 'Shipping method' form"
button = browser.find_by_css("button[type='submit']").first
button.click()
time.sleep(PURCHASE_STEP_SLEEP)
else:
print "No 'Shipping method' form"
#if browser.is_element_present_by_text('Payment method'):
if browser.is_element_present_by_css('.step[data-step="payment_method"]'):
print "Filling out 'Payment method' form"
# find the iframes
# iframes are obfuscated with numbers
# so find them by their prefix
# name = card-fields-name-s5tofcsnft5ungox
# number = card-fields-number-eon31canbfh6kalq
# expiry = card-fields-expiry-finw881f3og5qdi1
# cvv = card-fields-verification_value-3gtcr4ijx6v4o09l
def get_iframe_id(regexp):
match = re.search(regexp, browser.html, flags=re.I)
return match.group(0)
#print browser.html
iframe_name = get_iframe_id(r'(card-fields-name-[^"]+)')
iframe_number = get_iframe_id(r'(card-fields-number-[^"]+)')
iframe_expiry = get_iframe_id(r'(card-fields-expiry-[^"]+)')
iframe_cvv = get_iframe_id(r'(card-fields-verification_value-[^"]+)')
print 'Found iframes'
print 'iframe_name', iframe_name
print 'iframe_number', iframe_number
print 'iframe_expiry', iframe_expiry
print 'iframe_cvv', iframe_cvv
# there is a programmed spinner, so wait until it has finished loading
time.sleep(CC_SPINNER_SLEEP)
if CRASH:
# triggering a problem in phantomjs/selenium
# https://github.com/ariya/phantomjs/issues/14211#issuecomment-214983370
with browser.get_iframe(iframe_name) as iframe:
iframe.type('name', "Sherlock Holmes")
with browser.get_iframe(iframe_number) as iframe:
iframe.find_by_css('form #number').fill("1")
with browser.get_iframe(iframe_expiry) as iframe:
iframe.type('expiry', '10 / 20')
with browser.get_iframe(iframe_cvv) as iframe:
iframe.find_by_css('form #verification_value').fill("012")
else:
with browser.get_iframe(iframe_name) as iframe:
element = iframe.find_by_css('form #name')
element.type("Sherlock Holmes")
with browser.get_iframe(iframe_number) as iframe:
iframe.find_by_css('form #number').fill("1")
with browser.get_iframe(iframe_expiry) as iframe:
element = iframe.find_by_css('form #expiry')
for key in element.type('10 / 20', slowly=True):
assert element.value
with browser.get_iframe(iframe_cvv) as iframe:
iframe.find_by_css('form #verification_value').fill("012")
button = browser.find_by_css('button[type="submit"]').first
button.click()
time.sleep(CC_SPINNER_SLEEP)
else:
print "No 'Payment information' form"
if browser.is_element_present_by_css('svg.checkmark'):
print "Thank you page"
else:
print 'No thank you page!'
#print browser.html
except:
print browser.html
raise
browser.quit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment