skopix 2.0.43 → 2.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4149,18 +4149,32 @@ async function startStepTester(testerId, url, selector, mode, steps) {
4149
4149
 
4150
4150
  await ctx.exposeFunction('__skopixTesterRun', async ({ sel, action, value }) => {
4151
4151
  const result = await executeStepTesterAction(page, { selector: sel, action, value });
4152
- await page.evaluate((r, sel) => {
4152
+ // Update toolbar via exposeFunction callback — more reliable than evaluate
4153
+ await page.evaluate((passed, errMsg) => {
4153
4154
  const el = document.getElementById('__skopix_result');
4154
- if (el) el.textContent = r.passed ? '✓' : '✗';
4155
+ if (el) {
4156
+ el.textContent = passed ? '✓' : '✗';
4157
+ el.style.color = passed ? '#34d399' : '#ef4444';
4158
+ }
4159
+ }, result.passed, result.error || '').catch(async () => {
4160
+ // If evaluate fails (e.g. page navigated), wait and retry once
4161
+ await new Promise(r => setTimeout(r, 500));
4162
+ await page.evaluate((passed) => {
4163
+ const el = document.getElementById('__skopix_result');
4164
+ if (el) { el.textContent = passed ? '✓' : '✗'; el.style.color = passed ? '#34d399' : '#ef4444'; }
4165
+ }, result.passed).catch(() => {});
4166
+ });
4167
+ // Highlight element
4168
+ await page.evaluate((passed, sel) => {
4155
4169
  try {
4156
4170
  const target = document.querySelector(sel);
4157
4171
  if (target) {
4158
4172
  const orig = target.style.outline;
4159
- target.style.outline = r.passed ? '3px solid #34d399' : '3px solid #ef4444';
4173
+ target.style.outline = passed ? '3px solid #34d399' : '3px solid #ef4444';
4160
4174
  setTimeout(() => { target.style.outline = orig; }, 1500);
4161
4175
  }
4162
4176
  } catch {}
4163
- }, result, sel);
4177
+ }, result.passed, sel).catch(() => {});
4164
4178
  });
4165
4179
 
4166
4180
  await ctx.exposeFunction('__skopixTesterStop', async () => {
@@ -4170,6 +4184,8 @@ async function startStepTester(testerId, url, selector, mode, steps) {
4170
4184
  }
4171
4185
 
4172
4186
  if (url) await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 }).catch(() => {});
4187
+ // Ensure toolbar is injected on first page (DOMContentLoaded may have already fired)
4188
+ await page.evaluate(() => { if (window.__skopixTesterSelector !== undefined && !document.getElementById('__skopix_tester') && !document.getElementById('__skopix_preview')) { document.dispatchEvent(new Event('DOMContentLoaded')); } }).catch(() => {});
4173
4189
  stepTesterSessions.set(testerId, { browser, ctx, page });
4174
4190
  }
4175
4191
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skopix",
3
- "version": "2.0.43",
3
+ "version": "2.0.45",
4
4
  "description": "Browser-based QA tool — record tests by using your app, replay them deterministically, generate Playwright code automatically",
5
5
  "main": "cli/index.js",
6
6
  "bin": {
@@ -5604,7 +5604,7 @@ function renderPendingSteps(steps) {
5604
5604
  return;
5605
5605
  }
5606
5606
 
5607
- section.style.display = '';
5607
+ section.style.display = 'block';
5608
5608
  updatePendingBadge(steps.length);
5609
5609
  if (countLabel) countLabel.textContent = `${steps.length} element${steps.length > 1 ? 's' : ''} waiting`;
5610
5610
 
@@ -5631,6 +5631,7 @@ function renderPendingSteps(steps) {
5631
5631
  }
5632
5632
 
5633
5633
  async function loadLibraryView() {
5634
+ await new Promise(r => setTimeout(r, 50)); // ensure view is visible
5634
5635
  const [steps, pending] = await Promise.all([fetchLibrarySteps(), fetchPendingSteps()]);
5635
5636
  populateLibraryTagFilter();
5636
5637
  renderPendingSteps(pending);