Skip to content

Commit 3175c06

Browse files
committed
Stabilize browser CI checks
1 parent 92fb2b9 commit 3175c06

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

tests/PrompterOne.App.UITests/Editor/EditorOverlayInteractionTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ public async Task EditorScreen_HidesFloatingBarWhileToolbarDropdownIsOpen()
2020
var floatingBar = page.GetByTestId(UiTestIds.Editor.FloatingBar);
2121
var colorMenu = page.GetByTestId(UiTestIds.Editor.MenuColor);
2222

23-
await Expect(sourceInput).ToBeVisibleAsync();
23+
await Expect(sourceInput)
24+
.ToBeVisibleAsync(new() { Timeout = BrowserTestConstants.Timing.DefaultVisibleTimeoutMs });
2425
await sourceInput.EvaluateAsync(
2526
"(element, target) => { const start = element.value.indexOf(target); element.focus(); element.setSelectionRange(start, start + target.length); element.dispatchEvent(new Event('select', { bubbles: true })); element.dispatchEvent(new Event('keyup', { bubbles: true })); }",
2627
BrowserTestConstants.Editor.Welcome);

tests/PrompterOne.App.UITests/Learn/LearnStartupAlignmentTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ private static string BuildStartupTraceScript()
6868
const learnLineTestId = {{ToJsString(UiTestIds.Learn.OrpLine)}};
6969
const learnWordTestId = {{ToJsString(UiTestIds.Learn.Word)}};
7070
const maxSamples = 16;
71+
const maxAnimationFramePasses = maxSamples;
7172
7273
window.__learnStartupTrace = [];
7374
@@ -98,13 +99,28 @@ private static string BuildStartupTraceScript()
9899
});
99100
};
100101
102+
let animationFramePasses = 0;
103+
const captureOnAnimationFrame = () => {
104+
capture();
105+
106+
if (window.__learnStartupTrace.length >= maxSamples || animationFramePasses >= maxAnimationFramePasses) {
107+
return;
108+
}
109+
110+
animationFramePasses += 1;
111+
window.requestAnimationFrame(captureOnAnimationFrame);
112+
};
113+
101114
new MutationObserver(capture).observe(document, {
102115
attributeFilter: ['style', layoutReadyAttributeName],
103116
attributes: true,
104117
characterData: true,
105118
childList: true,
106119
subtree: true
107120
});
121+
122+
capture();
123+
window.requestAnimationFrame(captureOnAnimationFrame);
108124
})();
109125
""";
110126
}

tests/PrompterOne.App.UITests/Media/recording-file-harness.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
const minimumAudibleFrequencyValue = 8;
77
const minimumVisibleChannelValue = 12;
88
const minimumVisiblePixelCount = 16;
9+
const visibleVideoProbeTimeoutMs = 1500;
10+
const visibleVideoPollDelayMs = 100;
911
const readyStateHaveCurrentData = 2;
1012

1113
if (typeof window[harnessGlobalName] === "object" && window[harnessGlobalName] !== null) {
@@ -115,6 +117,36 @@
115117
};
116118
}
117119

120+
async function waitForNextVideoFrame(videoElement) {
121+
if (typeof videoElement.requestVideoFrameCallback === "function") {
122+
await new Promise(resolve => videoElement.requestVideoFrameCallback(() => resolve()));
123+
return;
124+
}
125+
126+
await new Promise(resolve => window.setTimeout(resolve, visibleVideoPollDelayMs));
127+
}
128+
129+
async function detectVisibleVideoAcrossFrames(videoElement) {
130+
const deadline = Date.now() + visibleVideoProbeTimeoutMs;
131+
let highestVisiblePixelCount = 0;
132+
133+
while (Date.now() <= deadline) {
134+
const sample = detectVisibleVideo(videoElement);
135+
highestVisiblePixelCount = Math.max(highestVisiblePixelCount, sample.nonBlackPixelCount);
136+
137+
if (sample.hasVisibleVideo) {
138+
return sample;
139+
}
140+
141+
await waitForNextVideoFrame(videoElement);
142+
}
143+
144+
return {
145+
hasVisibleVideo: highestVisiblePixelCount >= minimumVisiblePixelCount,
146+
nonBlackPixelCount: highestVisiblePixelCount
147+
};
148+
}
149+
118150
async function analyzeSavedRecording() {
119151
if (!(savedBlob instanceof Blob)) {
120152
return null;
@@ -139,7 +171,7 @@
139171
: null;
140172
const hasAudioTrack = Boolean(captureStream?.getAudioTracks?.().length);
141173
const hasAudibleAudio = await detectAudibleAudio(captureStream);
142-
const visibleVideo = detectVisibleVideo(videoElement);
174+
const visibleVideo = await detectVisibleVideoAcrossFrames(videoElement);
143175

144176
captureStream?.getTracks?.().forEach(track => track.stop());
145177

0 commit comments

Comments
 (0)