javascriptbrowsercameramediadevices

JavaScript programatically check if camera is being used


I'm writing functional tests for a video chat app.

I want to make sure that when the user leaves the meeting the camera turns off. So, I'm trying to check if the camera is being used or not.

Is there a way to do that programatically? I couldn't find any methods on navigator.MediaDevices that say "hey your camera is being used".


Solution

  • Here is how I solved it in TestCafe by "spying" on getUserMedia:

    const overWriteGetUserMedia = ClientFunction(() => {
      const realGetUserMedia = navigator.mediaDevices.getUserMedia;
      const allRequestedTracks = [];
      navigator.mediaDevices.getUserMedia = constraints =>
        realGetUserMedia(constraints).then(stream => {
          stream.getTracks().forEach(track => {
            allRequestedTracks.push(track);
          });
          return stream;
        });
      return allRequestedTracks;
    });
    
    test('leaving a meeting should end streams', async t => {
      const allRequestedTracks = await overWriteGetUserMedia();
    
      await t.wait(5000); // wait for streams to start;
    
      await t.click(screen.getByLabelText(/leave/i));
      await t.click(screen.getByLabelText(/yes, leave the meeting/i));
    
      await t.wait(1000); // wait for navigation;
    
      const actual = !allRequestedTracks.some(track => !track.ended);
      const expected = true;
    
      await t.expect(actual).eql(expected);
    });