[object Object]

← back to Pattern Vault

fernwick: fix Spoonflower uploader — upload page moved to /artists/designs/new

4fc904746d518380770b9ab924e81ab66d23a631 · 2026-07-07 16:38:33 -0700 · Steve Abrams

The uploader targeted stale URLs (/en/upload, /upload, /design_upload) which are now
just landing pages with an 'UPLOAD A DESIGN' link and NO file input — so every upload
failed with 'file input not found' and the pipeline published 0 designs despite running
daily. Spoonflower moved the real uploader to /artists/designs/new (confirmed: 1 hidden
input[type=file], accept image/jpeg,png). Fixed the URL list + wait for the input ATTACHED
(it's hidden dropzone-style; setInputFiles drives hidden inputs). Dry-run now finds the
input for all 3 test designs (was 3/3 failed → 0 failed). Session valid, generator works.

Files touched

Diff

commit 4fc904746d518380770b9ab924e81ab66d23a631
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jul 7 16:38:33 2026 -0700

    fernwick: fix Spoonflower uploader — upload page moved to /artists/designs/new
    
    The uploader targeted stale URLs (/en/upload, /upload, /design_upload) which are now
    just landing pages with an 'UPLOAD A DESIGN' link and NO file input — so every upload
    failed with 'file input not found' and the pipeline published 0 designs despite running
    daily. Spoonflower moved the real uploader to /artists/designs/new (confirmed: 1 hidden
    input[type=file], accept image/jpeg,png). Fixed the URL list + wait for the input ATTACHED
    (it's hidden dropzone-style; setInputFiles drives hidden inputs). Dry-run now finds the
    input for all 3 test designs (was 3/3 failed → 0 failed). Session valid, generator works.
---
 whimsical-compare/daily/scripts/upload_sf.js | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/whimsical-compare/daily/scripts/upload_sf.js b/whimsical-compare/daily/scripts/upload_sf.js
index 31508ee..bef0528 100755
--- a/whimsical-compare/daily/scripts/upload_sf.js
+++ b/whimsical-compare/daily/scripts/upload_sf.js
@@ -77,13 +77,19 @@ async function messyType(el, text) {
 
   // reach the uploader the proven way: homepage -> account menu -> "UPLOAD A DESIGN"
   async function openUploader() {
-    // try known direct URLs first, then fall back to the menu link
-    for (const u of ['https://www.spoonflower.com/en/upload', 'https://www.spoonflower.com/upload',
-                     'https://www.spoonflower.com/design_upload']) {
+    // try known direct URLs first, then fall back to the menu link.
+    // 2026-07-07: the real uploader moved to /artists/designs/new — the old /en/upload,
+    // /upload, /design_upload are now just landing pages (an "UPLOAD A DESIGN" link, no
+    // file input), which is why every upload failed with "file input not found".
+    for (const u of ['https://www.spoonflower.com/artists/designs/new',
+                     'https://www.spoonflower.com/en/upload', 'https://www.spoonflower.com/upload']) {
       await pg.goto(u, { waitUntil: 'domcontentloaded', timeout: 40000 }).catch(() => {});
       await sleep(rnd(1500, 3000));
       if (pg.url().includes('/login')) return 'login';
-      if (await pg.$('input[type=file]')) return 'ok';
+      // the file input is HIDDEN (dropzone pattern) — wait for it ATTACHED, not visible;
+      // setInputFiles() drives hidden inputs fine.
+      const fi = await pg.waitForSelector('input[type=file]', { state: 'attached', timeout: 8000 }).catch(() => null);
+      if (fi) return 'ok';
     }
     // menu fallback
     await pg.goto('https://www.spoonflower.com/', { waitUntil: 'domcontentloaded', timeout: 40000 }).catch(() => {});

← 3007363 chore: v0.2.1 (session close)  ·  back to Pattern Vault  ·  chore: v0.2.2 (session close) — Spoonflower uploader fix (up 5903c70 →