← back to Designer Wallcoverings
auto-save: 2026-07-10T12:38:21 (4 files) — _dw-login-record.mjs pending-approval/boost-filter-consolidation-2026-06-25 scripts/pr-contact-for-price vendor-scrapers/china-seas-refresh
0b3ab024c4a6c45449a7982d84117dd0132b2455 · 2026-07-10 12:38:26 -0700 · Steve Abrams
Files touched
Diff
commit 0b3ab024c4a6c45449a7982d84117dd0132b2455
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Jul 10 12:38:26 2026 -0700
auto-save: 2026-07-10T12:38:21 (4 files) — _dw-login-record.mjs pending-approval/boost-filter-consolidation-2026-06-25 scripts/pr-contact-for-price vendor-scrapers/china-seas-refresh
---
_dw-login-record.mjs | 86 ----------------------------------------------------
1 file changed, 86 deletions(-)
diff --git a/_dw-login-record.mjs b/_dw-login-record.mjs
deleted file mode 100644
index 908df2c5..00000000
--- a/_dw-login-record.mjs
+++ /dev/null
@@ -1,86 +0,0 @@
-import { chromium } from 'playwright';
-import fs from 'fs';
-
-const EXE = '/Users/macstudio3/Library/Caches/ms-playwright/chromium_headless_shell-1228/chrome-headless-shell-mac-arm64/chrome-headless-shell';
-const EMAIL = process.env.LOGIN_EMAIL || 'steve@designerwallcoverings.com';
-const OTP_FILE = '/tmp/dw-otp.txt';
-const LOG = m => { console.log(new Date().toISOString().slice(11,19), m); };
-try { fs.unlinkSync(OTP_FILE); } catch {}
-
-const browser = await chromium.launch({ headless: true, executablePath: EXE });
-const ctx = await browser.newContext({
- viewport: { width: 1280, height: 800 },
- recordVideo: { dir: '/tmp/dw-login-video', size: { width: 1280, height: 800 } },
- userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Safari/537.36'
-});
-const page = await ctx.newPage();
-const out = { email: EMAIL, steps: [] };
-const step = (n, extra={}) => { out.steps.push({ n, url: page.url(), ...extra }); LOG(n + ' | ' + page.url().slice(0,80)); };
-
-try {
- await page.goto('https://designerwallcoverings.com', { waitUntil: 'domcontentloaded', timeout: 45000 });
- await page.waitForTimeout(2500); step('home');
- const trig = await page.$('[data-dw-signin], a[href$="#dw-signin"]');
- if (trig) { await trig.click().catch(()=>{}); }
- await page.waitForTimeout(1000);
- await page.screenshot({ path: '/tmp/dw-login-01-modal.png' }).catch(()=>{});
- const loginBtn = await page.$('[data-dwsm-login]');
- const loginUrl = loginBtn ? await loginBtn.getAttribute('data-dwsm-login') : 'https://designerwallcoverings.com/account';
- await page.goto(loginUrl.startsWith('http') ? loginUrl : 'https://designerwallcoverings.com'+loginUrl, { waitUntil: 'domcontentloaded', timeout: 45000 }).catch(()=>{});
- await page.waitForTimeout(4000); step('native-login');
- await page.screenshot({ path: '/tmp/dw-login-02-emailpage.png' }).catch(()=>{});
-
- const emailInput = await page.$('input[type="email"], input[name="account[email]"], input[autocomplete="email"]');
- if (!emailInput) throw new Error('no email input found on login page');
- await emailInput.fill(EMAIL);
- await page.waitForTimeout(400);
- await emailInput.press('Enter').catch(()=>{});
- await page.waitForTimeout(4000); step('after-email');
- const useEmail = await page.$('button:has-text("Use email instead"), a:has-text("Use email instead"), :text("Use email instead")');
- if (useEmail) { await useEmail.click({ timeout: 3000 }).catch(()=>{}); out.usedEmailInstead = true; await page.waitForTimeout(4000); }
- const sub = await page.$('button[type="submit"], button:has-text("Continue"), button:has-text("Submit")');
- if (sub) await sub.click({ timeout: 3000 }).catch(()=>{});
- await page.waitForTimeout(5000); step('code-requested');
- await page.screenshot({ path: '/tmp/dw-login-03-codepage.png' }).catch(()=>{});
-
- let code = null;
- for (let i = 0; i < 60; i++) {
- if (fs.existsSync(OTP_FILE)) {
- const v = fs.readFileSync(OTP_FILE, 'utf8').trim();
- if (/^\d{6}$/.test(v)) { code = v; break; }
- }
- await page.waitForTimeout(3000);
- }
- out.gotCode = !!code;
- if (!code) { step('NO-CODE-TIMEOUT'); throw new Error('OTP not delivered to poll file in time'); }
- LOG('got code ' + code);
-
- const digitInputs = await page.$$('input[inputmode="numeric"], input[autocomplete="one-time-code"], input[maxlength="1"]');
- if (digitInputs.length >= 6) {
- for (let i = 0; i < 6; i++) { await digitInputs[i].fill(code[i]); await page.waitForTimeout(120); }
- } else {
- const one = await page.$('input[name="code"], input[inputmode="numeric"], input[type="text"], input[type="tel"]');
- if (one) { await one.fill(code); } else { await page.keyboard.type(code, { delay: 120 }); }
- }
- // Shopify OTP auto-submits on the 6th digit; wait for the URL to leave /code.
- try { await page.waitForURL(u => !/\/code(\?|$)/.test(String(u)), { timeout: 25000 }); } catch {}
- await page.waitForTimeout(6000);
- try { await page.waitForLoadState('networkidle', { timeout: 12000 }); } catch {}
- await page.waitForTimeout(3000);
- step('LANDING');
- out.landingUrl = page.url();
- out.landingTitle = await page.title().catch(()=> '');
- out.landingText = ((await page.evaluate(()=> document.body?document.body.innerText:'').catch(()=> ''))||'').replace(/\s+/g,' ').slice(0,500);
- await page.screenshot({ path: '/tmp/dw-login-04-landing.png', fullPage: false }).catch(()=>{});
- out.ok = true;
-} catch (e) {
- out.error = e.message;
- await page.screenshot({ path: '/tmp/dw-login-ERR.png' }).catch(()=>{});
-} finally {
- const vid = page.video();
- await ctx.close();
- try { out.videoPath = vid ? await vid.path() : null; } catch {}
- await browser.close();
- fs.writeFileSync('/tmp/dw-login-result.json', JSON.stringify(out, null, 2));
- console.log('RESULT ' + JSON.stringify({ ok: out.ok, landingUrl: out.landingUrl, landingTitle: out.landingTitle, error: out.error }));
-}
← 45d52c93 auto-save: 2026-07-10T12:08:12 (6 files) — DW-Programming/sc
·
back to Designer Wallcoverings
·
auto-save: 2026-07-10T13:08:29 (4 files) — pending-approval/ a68ab1ce →