Created
June 1, 2017 23:23
-
-
Save adamlwgriffiths/0db58522186ebc301d43173e808be8be to your computer and use it in GitHub Desktop.
Selenium test for issue #2214
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]", "[email protected]") | |
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