diff --git a/fpdfsdk/cpdfsdk_baannot_embeddertest.cpp b/fpdfsdk/cpdfsdk_baannot_embeddertest.cpp
index b70ffa9..5b207b8 100644
--- a/fpdfsdk/cpdfsdk_baannot_embeddertest.cpp
+++ b/fpdfsdk/cpdfsdk_baannot_embeddertest.cpp
@@ -17,25 +17,31 @@
  public:
   void SetUp() override {
     EmbedderTest::SetUp();
-    SetUpBAAnnot();
-  }
-
-  void TearDown() override {
-    UnloadPage(m_page);
-    EmbedderTest::TearDown();
-  }
-
-  void SetUpBAAnnot() {
     ASSERT_TRUE(OpenDocument("links_highlights_annots.pdf"));
-    m_page = LoadPage(0);
-    ASSERT_TRUE(m_page);
+  }
 
+  ScopedEmbedderTestPage SetUpBAAnnot() {
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
+    if (!page) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
     m_pFormFillEnv =
         CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle());
-    ASSERT_TRUE(m_pFormFillEnv);
+    if (!m_pFormFillEnv) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
+
     m_pPageView =
-        m_pFormFillEnv->GetOrCreatePageView(IPDFPageFromFPDFPage(m_page));
-    ASSERT_TRUE(m_pPageView);
+        m_pFormFillEnv->GetOrCreatePageView(IPDFPageFromFPDFPage(page.get()));
+
+    if (!m_pPageView) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
+
+    return page;
   }
 
   CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; }
@@ -57,12 +63,14 @@
   }
 
  private:
-  FPDF_PAGE m_page = nullptr;
   CPDFSDK_PageView* m_pPageView = nullptr;
   CPDFSDK_FormFillEnvironment* m_pFormFillEnv = nullptr;
 };
 
 TEST_F(CPDFSDKBAAnnotTest, TabToLinkOrHighlightAnnot) {
+  ScopedEmbedderTestPage page = SetUpBAAnnot();
+  ASSERT_TRUE(page);
+
   std::vector<CPDF_Annot::Subtype> focusable_annot_types = {
       CPDF_Annot::Subtype::WIDGET, CPDF_Annot::Subtype::LINK,
       CPDF_Annot::Subtype::HIGHLIGHT};
diff --git a/fpdfsdk/formfiller/cffl_combobox_embeddertest.cpp b/fpdfsdk/formfiller/cffl_combobox_embeddertest.cpp
index dbde075..4e63e41 100644
--- a/fpdfsdk/formfiller/cffl_combobox_embeddertest.cpp
+++ b/fpdfsdk/formfiller/cffl_combobox_embeddertest.cpp
@@ -10,6 +10,8 @@
 class CFFLComboBoxEmbedderTest : public CPWLComboBoxEmbedderTest {};
 
 TEST_F(CFFLComboBoxEmbedderTest, GetActionData) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal());
   {
     CFFL_FieldAction result;
@@ -35,6 +37,8 @@
 }
 
 TEST_F(CFFLComboBoxEmbedderTest, SetActionData) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal());
   CFFL_FieldAction input_fa;
   input_fa.nSelStart = 2;
diff --git a/fpdfsdk/pwl/cpwl_combo_box_edit_embeddertest.cpp b/fpdfsdk/pwl/cpwl_combo_box_edit_embeddertest.cpp
index 0c2c334..fe3c9f7 100644
--- a/fpdfsdk/pwl/cpwl_combo_box_edit_embeddertest.cpp
+++ b/fpdfsdk/pwl/cpwl_combo_box_edit_embeddertest.cpp
@@ -18,6 +18,9 @@
 class CPWLComboBoxEditEmbedderTest : public CPWLComboBoxEmbedderTest {};
 
 TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextEmptyAndBasicNormal) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal());
 
   // Automatically pre-filled with "Banana".
@@ -40,6 +43,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextFragmentsNormal) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal());
   EXPECT_EQ(L"Banana", GetCPWLComboBox()->GetText());
 
@@ -66,6 +72,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextEmptyAndBasicEditable) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   EXPECT_TRUE(GetCPWLComboBox()->GetText().IsEmpty());
 
@@ -95,6 +104,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextFragmentsEditable) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(50);
 
@@ -125,6 +137,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteEntireTextSelection) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(50);
 
@@ -137,6 +152,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionMiddle) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(50);
 
@@ -149,6 +167,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionLeft) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(50);
 
@@ -161,6 +182,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionRight) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(50);
 
@@ -173,6 +197,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteEmptyTextSelection) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(50);
 
@@ -182,6 +209,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextInEmptyEditableComboBox) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   GetCPWLComboBox()->ReplaceSelection(L"Hello");
   EXPECT_EQ(L"Hello", GetCPWLComboBox()->GetText());
@@ -189,6 +219,9 @@
 
 TEST_F(CPWLComboBoxEditEmbedderTest,
        InsertTextInPopulatedEditableComboBoxLeft) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(10);
 
@@ -201,6 +234,9 @@
 
 TEST_F(CPWLComboBoxEditEmbedderTest,
        InsertTextInPopulatedEditableComboBoxMiddle) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(10);
 
@@ -215,6 +251,9 @@
 
 TEST_F(CPWLComboBoxEditEmbedderTest,
        InsertTextInPopulatedEditableComboBoxRight) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(10);
 
@@ -224,6 +263,9 @@
 
 TEST_F(CPWLComboBoxEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedEditableComboBoxWhole) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(10);
 
@@ -235,6 +277,9 @@
 
 TEST_F(CPWLComboBoxEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedEditableComboBoxLeft) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(10);
 
@@ -246,6 +291,9 @@
 
 TEST_F(CPWLComboBoxEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedEditableComboBoxMiddle) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(10);
 
@@ -257,6 +305,9 @@
 
 TEST_F(CPWLComboBoxEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedEditableComboBoxRight) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(10);
 
@@ -267,6 +318,9 @@
 }
 
 TEST_F(CPWLComboBoxEditEmbedderTest, ReplaceAndKeepSelection) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
+  ASSERT_TRUE(page);
+
   FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
   TypeTextIntoTextField(10);
 
diff --git a/fpdfsdk/pwl/cpwl_combo_box_embeddertest.cpp b/fpdfsdk/pwl/cpwl_combo_box_embeddertest.cpp
index 299672f..38c43e8 100644
--- a/fpdfsdk/pwl/cpwl_combo_box_embeddertest.cpp
+++ b/fpdfsdk/pwl/cpwl_combo_box_embeddertest.cpp
@@ -17,35 +17,42 @@
 
 void CPWLComboBoxEmbedderTest::SetUp() {
   EmbedderTest::SetUp();
-  CreateAndInitializeFormComboboxPDF();
-}
-
-void CPWLComboBoxEmbedderTest::TearDown() {
-  UnloadPage(GetPage());
-  EmbedderTest::TearDown();
-}
-
-void CPWLComboBoxEmbedderTest::CreateAndInitializeFormComboboxPDF() {
   ASSERT_TRUE(OpenDocument("combobox_form.pdf"));
-  m_page = LoadPage(0);
-  ASSERT_TRUE(m_page);
+}
 
+CPWLComboBoxEmbedderTest::ScopedEmbedderTestPage
+CPWLComboBoxEmbedderTest::CreateAndInitializeFormComboboxPDF() {
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  if (!page) {
+    ADD_FAILURE();
+    return ScopedEmbedderTestPage();
+  }
   m_pFormFillEnv = CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle());
   m_pPageView = m_pFormFillEnv->GetPageViewAtIndex(0);
   CPDFSDK_AnnotIterator iter(m_pPageView, {CPDF_Annot::Subtype::WIDGET});
 
   // User editable combobox.
   m_pAnnotEditable = ToCPDFSDKWidget(iter.GetFirstAnnot());
-  ASSERT_TRUE(m_pAnnotEditable);
+  if (!m_pAnnotEditable) {
+    ADD_FAILURE();
+    return ScopedEmbedderTestPage();
+  }
 
   // Normal combobox with pre-selected value.
   m_pAnnotNormal = ToCPDFSDKWidget(iter.GetNextAnnot(m_pAnnotEditable));
-  ASSERT_TRUE(m_pAnnotNormal);
+  if (!m_pAnnotEditable) {
+    ADD_FAILURE();
+    return ScopedEmbedderTestPage();
+  }
 
   // Read-only combobox.
   CPDFSDK_Annot* pAnnotReadOnly = iter.GetNextAnnot(m_pAnnotNormal);
   CPDFSDK_Annot* pLastAnnot = iter.GetLastAnnot();
-  ASSERT_EQ(pAnnotReadOnly, pLastAnnot);
+  if (pAnnotReadOnly != pLastAnnot) {
+    ADD_FAILURE();
+    return ScopedEmbedderTestPage();
+  }
+  return page;
 }
 
 void CPWLComboBoxEmbedderTest::FormFillerAndWindowSetup(
diff --git a/fpdfsdk/pwl/cpwl_combo_box_embeddertest.h b/fpdfsdk/pwl/cpwl_combo_box_embeddertest.h
index eaf0678..327e300 100644
--- a/fpdfsdk/pwl/cpwl_combo_box_embeddertest.h
+++ b/fpdfsdk/pwl/cpwl_combo_box_embeddertest.h
@@ -5,7 +5,6 @@
 #ifndef FPDFSDK_PWL_CPWL_COMBO_BOX_EMBEDDERTEST_H_
 #define FPDFSDK_PWL_CPWL_COMBO_BOX_EMBEDDERTEST_H_
 
-#include "public/fpdfview.h"
 #include "testing/embedder_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -18,12 +17,10 @@
 class CPWLComboBoxEmbedderTest : public EmbedderTest {
  protected:
   void SetUp() override;
-  void TearDown() override;
 
-  void CreateAndInitializeFormComboboxPDF();
+  ScopedEmbedderTestPage CreateAndInitializeFormComboboxPDF();
   void FormFillerAndWindowSetup(CPDFSDK_Widget* pAnnotCombobox);
   void TypeTextIntoTextField(int num_chars);
-  FPDF_PAGE GetPage() const { return m_page; }
   CPWL_ComboBox* GetCPWLComboBox() const { return m_pComboBox; }
   CFFL_FormField* GetCFFLFormField() const { return m_pFormField; }
   CPDFSDK_Widget* GetCPDFSDKAnnotNormal() const { return m_pAnnotNormal; }
@@ -36,7 +33,6 @@
   CPDFSDK_PageView* GetPageView() const { return m_pPageView; }
 
  private:
-  FPDF_PAGE m_page;
   CPWL_ComboBox* m_pComboBox = nullptr;
   CFFL_FormField* m_pFormField = nullptr;
   CPDFSDK_Widget* m_pAnnotNormal = nullptr;
diff --git a/fpdfsdk/pwl/cpwl_edit_embeddertest.cpp b/fpdfsdk/pwl/cpwl_edit_embeddertest.cpp
index 0aaa0d4..9186abe 100644
--- a/fpdfsdk/pwl/cpwl_edit_embeddertest.cpp
+++ b/fpdfsdk/pwl/cpwl_edit_embeddertest.cpp
@@ -20,41 +20,53 @@
  protected:
   void SetUp() override {
     EmbedderTest::SetUp();
-    CreateAndInitializeFormPDF();
-  }
-
-  void TearDown() override {
-    UnloadPage(GetPage());
-    EmbedderTest::TearDown();
-  }
-
-  void CreateAndInitializeFormPDF() {
     ASSERT_TRUE(OpenDocument("text_form_multiple.pdf"));
-    m_page = LoadPage(0);
-    ASSERT_TRUE(m_page);
+  }
 
+  ScopedEmbedderTestPage CreateAndInitializeFormPDF() {
+    ScopedEmbedderTestPage page = LoadScopedPage(0);
+    if (!page) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
     m_pFormFillEnv =
         CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle());
     CPDFSDK_AnnotIterator iter(m_pFormFillEnv->GetPageViewAtIndex(0),
                                {CPDF_Annot::Subtype::WIDGET});
     // Normal text field.
     m_pAnnot = ToCPDFSDKWidget(iter.GetFirstAnnot());
-    ASSERT_TRUE(m_pAnnot);
+    if (!m_pAnnot) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
 
     // Read-only text field.
     CPDFSDK_Annot* pAnnotReadOnly = iter.GetNextAnnot(m_pAnnot);
 
     // Pre-filled text field with char limit of 10.
     m_pAnnotCharLimit = ToCPDFSDKWidget(iter.GetNextAnnot(pAnnotReadOnly));
-    ASSERT_TRUE(m_pAnnotCharLimit);
+    if (!m_pAnnotCharLimit) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
 
     // Password text field.
     CPDFSDK_Annot* password_annot = iter.GetNextAnnot(m_pAnnotCharLimit);
-    ASSERT_TRUE(password_annot);
-    ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, password_annot->GetAnnotSubtype());
+    if (!password_annot) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
+    if (CPDF_Annot::Subtype::WIDGET != password_annot->GetAnnotSubtype()) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
 
     CPDFSDK_Annot* pLastAnnot = iter.GetLastAnnot();
-    ASSERT_EQ(password_annot, pLastAnnot);
+    if (password_annot != pLastAnnot) {
+      ADD_FAILURE();
+      return ScopedEmbedderTestPage();
+    }
+    return page;
   }
 
   void FormFillerAndWindowSetup(CPDFSDK_Widget* pAnnotTextField) {
@@ -82,14 +94,12 @@
     }
   }
 
-  FPDF_PAGE GetPage() { return m_page; }
   CPWL_Edit* GetCPWLEdit() { return m_pEdit; }
   CFFL_FormField* GetCFFLFormFiller() { return m_pFormFiller; }
   CPDFSDK_Widget* GetCPDFSDKAnnot() { return m_pAnnot; }
   CPDFSDK_Widget* GetCPDFSDKAnnotCharLimit() { return m_pAnnotCharLimit; }
 
  private:
-  FPDF_PAGE m_page;
   CPWL_Edit* m_pEdit;
   CFFL_FormField* m_pFormFiller;
   CPDFSDK_Widget* m_pAnnot;
@@ -98,6 +108,8 @@
 };
 
 TEST_F(CPWLEditEmbedderTest, TypeText) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   EXPECT_TRUE(GetCPWLEdit()->GetText().IsEmpty());
   EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'a', {}));
@@ -108,6 +120,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, GetSelectedTextEmptyAndBasic) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   // Attempt to set selection before text has been typed to test that
   // selection is identified as empty.
@@ -125,6 +139,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, GetSelectedTextFragments) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(50);
 
@@ -155,6 +171,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, DeleteEntireTextSelection) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(50);
 
@@ -167,6 +185,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, DeleteTextSelectionMiddle) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(50);
 
@@ -179,6 +199,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, DeleteTextSelectionLeft) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(50);
 
@@ -191,6 +213,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, DeleteTextSelectionRight) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(50);
 
@@ -203,6 +227,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, DeleteEmptyTextSelection) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(50);
 
@@ -212,12 +238,16 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInEmptyTextField) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->ReplaceSelection(L"Hello");
   EXPECT_EQ(L"Hello", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedTextFieldLeft) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(10);
 
@@ -229,6 +259,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedTextFieldMiddle) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(10);
 
@@ -242,6 +274,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedTextFieldRight) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(10);
 
@@ -251,6 +285,8 @@
 
 TEST_F(CPWLEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedTextFieldWhole) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(10);
 
@@ -262,6 +298,8 @@
 
 TEST_F(CPWLEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedTextFieldLeft) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(10);
 
@@ -273,6 +311,8 @@
 
 TEST_F(CPWLEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedTextFieldMiddle) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(10);
 
@@ -284,6 +324,8 @@
 
 TEST_F(CPWLEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedTextFieldRight) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(10);
 
@@ -294,6 +336,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInEmptyCharLimitTextFieldOverflow) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   GetCPWLEdit()->SetSelection(0, -1);
   EXPECT_EQ(L"Elephant", GetCPWLEdit()->GetSelectedText());
@@ -304,6 +348,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInEmptyCharLimitTextFieldFit) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   GetCPWLEdit()->SetSelection(0, -1);
   EXPECT_EQ(L"Elephant", GetCPWLEdit()->GetSelectedText());
@@ -314,12 +360,16 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedCharLimitTextFieldLeft) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   GetCPWLEdit()->ReplaceSelection(L"Hippopotamus");
   EXPECT_EQ(L"HiElephant", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedCharLimitTextFieldMiddle) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   // Move cursor to middle of text field.
   for (int i = 0; i < 5; ++i) {
@@ -331,6 +381,8 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedCharLimitTextFieldRight) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   // Move cursor to end of text field.
   EXPECT_TRUE(GetCFFLFormFiller()->OnKeyDown(FWL_VKEY_End, {}));
@@ -341,6 +393,8 @@
 
 TEST_F(CPWLEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldWhole) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   GetCPWLEdit()->SetSelection(0, -1);
   EXPECT_EQ(L"Elephant", GetCPWLEdit()->GetSelectedText());
@@ -350,6 +404,8 @@
 
 TEST_F(CPWLEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldLeft) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   GetCPWLEdit()->SetSelection(0, 4);
   EXPECT_EQ(L"Elep", GetCPWLEdit()->GetSelectedText());
@@ -359,6 +415,8 @@
 
 TEST_F(CPWLEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldMiddle) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   GetCPWLEdit()->SetSelection(2, 6);
   EXPECT_EQ(L"epha", GetCPWLEdit()->GetSelectedText());
@@ -368,6 +426,8 @@
 
 TEST_F(CPWLEditEmbedderTest,
        InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldRight) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit());
   GetCPWLEdit()->SetSelection(4, 8);
   EXPECT_EQ(L"hant", GetCPWLEdit()->GetSelectedText());
@@ -376,54 +436,72 @@
 }
 
 TEST_F(CPWLEditEmbedderTest, SetTextWithEndCarriageFeed) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->SetText(L"Foo\r");
   EXPECT_EQ(L"Foo", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, SetTextWithEndNewline) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->SetText(L"Foo\n");
   EXPECT_EQ(L"Foo", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, SetTextWithEndCarriageFeedAndNewLine) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->SetText(L"Foo\r\n");
   EXPECT_EQ(L"Foo", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, SetTextWithEndNewLineAndCarriageFeed) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->SetText(L"Foo\n\r");
   EXPECT_EQ(L"Foo", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, SetTextWithBodyCarriageFeed) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->SetText(L"Foo\rBar");
   EXPECT_EQ(L"FooBar", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, SetTextWithBodyNewline) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->SetText(L"Foo\nBar");
   EXPECT_EQ(L"FooBar", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, SetTextWithBodyCarriageFeedAndNewLine) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->SetText(L"Foo\r\nBar");
   EXPECT_EQ(L"FooBar", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, SetTextWithBodyNewLineAndCarriageFeed) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   GetCPWLEdit()->SetText(L"Foo\n\rBar");
   EXPECT_EQ(L"FooBar", GetCPWLEdit()->GetText());
 }
 
 TEST_F(CPWLEditEmbedderTest, ReplaceAndKeepSelection) {
+  ScopedEmbedderTestPage page = CreateAndInitializeFormPDF();
+  ASSERT_TRUE(page);
   FormFillerAndWindowSetup(GetCPDFSDKAnnot());
   TypeTextIntoTextField(10);
 
diff --git a/fpdfsdk/pwl/cpwl_special_button_embeddertest.cpp b/fpdfsdk/pwl/cpwl_special_button_embeddertest.cpp
index c12f037..e9f1d6d 100644
--- a/fpdfsdk/pwl/cpwl_special_button_embeddertest.cpp
+++ b/fpdfsdk/pwl/cpwl_special_button_embeddertest.cpp
@@ -15,20 +15,14 @@
  protected:
   void SetUp() override {
     EmbedderTest::SetUp();
-    CreateAndInitializeFormPDF();
+    ASSERT_TRUE(OpenDocument("click_form.pdf"));
   }
 
   void TearDown() override {
-    UnloadPage(page_);
     EmbedderTest::TearDown();
   }
 
   void CreateAndInitializeFormPDF() {
-    ASSERT_TRUE(OpenDocument("click_form.pdf"));
-
-    page_ = LoadPage(0);
-    ASSERT_TRUE(page_);
-
     formfill_env_ = CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle());
     CPDFSDK_AnnotIterator it(formfill_env_->GetPageViewAtIndex(0),
                              {CPDF_Annot::Subtype::WIDGET});
@@ -98,7 +92,6 @@
   CPWL_Wnd* GetWindow() const { return window_; }
 
  private:
-  FPDF_PAGE page_;
   CFFL_FormField* form_filler_;
   CPDFSDK_Widget* widget_checkbox_;
   CPDFSDK_Widget* widget_readonly_checkbox_;
@@ -109,6 +102,10 @@
 };
 
 TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnReadOnlyCheckBox) {
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  ASSERT_TRUE(page);
+  CreateAndInitializeFormPDF();
+
   FormFillerAndWindowSetup(GetCPDFSDKWidgetReadOnlyCheckBox());
   CPWL_CheckBox* check_box = static_cast<CPWL_CheckBox*>(GetWindow());
   EXPECT_TRUE(check_box->IsChecked());
@@ -118,6 +115,10 @@
 }
 
 TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnCheckBox) {
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  ASSERT_TRUE(page);
+  CreateAndInitializeFormPDF();
+
   FormFillerAndWindowSetup(GetCPDFSDKWidgetCheckBox());
   CPWL_CheckBox* check_box = static_cast<CPWL_CheckBox*>(GetWindow());
   EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar(
@@ -130,6 +131,10 @@
 }
 
 TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnReadOnlyRadioButton) {
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  ASSERT_TRUE(page);
+  CreateAndInitializeFormPDF();
+
   FormFillerAndWindowSetup(GetCPDFSDKWidgetReadOnlyRadioButton());
   CPWL_RadioButton* radio_button = static_cast<CPWL_RadioButton*>(GetWindow());
   EXPECT_FALSE(radio_button->IsChecked());
@@ -139,6 +144,10 @@
 }
 
 TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnRadioButton) {
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  ASSERT_TRUE(page);
+  CreateAndInitializeFormPDF();
+
   FormFillerAndWindowSetup(GetCPDFSDKWidgetRadioButton());
   CPWL_RadioButton* radio_button = static_cast<CPWL_RadioButton*>(GetWindow());
   EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar(
diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp
index 9ae5bc0..dadce90 100644
--- a/testing/embedder_test.cpp
+++ b/testing/embedder_test.cpp
@@ -889,6 +889,9 @@
 }
 #endif
 
+EmbedderTest::ScopedEmbedderTestPage::ScopedEmbedderTestPage()
+    : test_(nullptr), page_(nullptr) {}
+
 EmbedderTest::ScopedEmbedderTestPage::ScopedEmbedderTestPage(EmbedderTest* test,
                                                              int page_index)
     : test_(test), page_(test->LoadPage(page_index)) {}
diff --git a/testing/embedder_test.h b/testing/embedder_test.h
index a987daa..1ef2ff6 100644
--- a/testing/embedder_test.h
+++ b/testing/embedder_test.h
@@ -91,6 +91,7 @@
 
   class ScopedEmbedderTestPage {
    public:
+    ScopedEmbedderTestPage();
     ScopedEmbedderTestPage(EmbedderTest* test, int page_index);
     ScopedEmbedderTestPage(const ScopedEmbedderTestPage&) = delete;
     ScopedEmbedderTestPage& operator=(const ScopedEmbedderTestPage&) = delete;
diff --git a/xfa/fwl/cfwl_edit_embeddertest.cpp b/xfa/fwl/cfwl_edit_embeddertest.cpp
index 1caaf32..9ec922e 100644
--- a/xfa/fwl/cfwl_edit_embeddertest.cpp
+++ b/xfa/fwl/cfwl_edit_embeddertest.cpp
@@ -39,49 +39,43 @@
   void TearDown() override {
     FSDK_SetTimeFunction(nullptr);
     FSDK_SetLocaltimeFunction(nullptr);
-    // TODO(crbug.com/pdfium/11): A page might not have been loaded if a test
-    // is skipped at runtime. This check for a non-null page should be able to
-    // removed once none of the tests are being skipped for Skia.
-    if (page())
-      UnloadPage(page());
     EmbedderTest::TearDown();
   }
 
   void CreateAndInitializeFormPDF(const char* filename) {
     ASSERT_TRUE(OpenDocument(filename));
-    page_ = LoadPage(0);
-    ASSERT_TRUE(page_);
   }
 
-  FPDF_PAGE page() const { return page_; }
   EmbedderTestTimerHandlingDelegate delegate() const { return delegate_; }
 
  private:
-  FPDF_PAGE page_ = nullptr;
   EmbedderTestTimerHandlingDelegate delegate_;
 };
 
 TEST_F(CFWLEditEmbedderTest, Trivial) {
   CreateAndInitializeFormPDF("xfa/email_recommended.pdf");
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   ASSERT_EQ(0u, delegate().GetAlerts().size());
 }
 
 TEST_F(CFWLEditEmbedderTest, LeftClickMouseSelection) {
   CreateAndInitializeFormPDF("xfa/email_recommended.pdf");
-  FORM_OnLButtonDown(form_handle(), page(), 0, 115, 58);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 115, 58);
   for (size_t i = 0; i < 10; ++i)
-    FORM_OnChar(form_handle(), page(), 'a' + i, 0);
+    FORM_OnChar(form_handle(), page.get(), 'a' + i, 0);
 
   // Mouse selection
-  FORM_OnLButtonDown(form_handle(), page(), 0, 128, 58);
-  FORM_OnLButtonDown(form_handle(), page(), FWL_EVENTFLAG_ShiftKey, 152, 58);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 128, 58);
+  FORM_OnLButtonDown(form_handle(), page.get(), FWL_EVENTFLAG_ShiftKey, 152,
+                     58);
 
   // 12 == (2 * strlen(defgh)) + 2 (for \0\0)
-  ASSERT_EQ(12U, FORM_GetSelectedText(form_handle(), page(), nullptr, 0));
+  ASSERT_EQ(12U, FORM_GetSelectedText(form_handle(), page.get(), nullptr, 0));
 
   uint16_t buf[6];
   ASSERT_EQ(12U,
-            FORM_GetSelectedText(form_handle(), page(), &buf, sizeof(buf)));
+            FORM_GetSelectedText(form_handle(), page.get(), &buf, sizeof(buf)));
   EXPECT_EQ("defgh", GetPlatformString(buf));
 }
 
@@ -92,27 +86,28 @@
   }
 
   CreateAndInitializeFormPDF("xfa/email_recommended.pdf");
-  FORM_OnLButtonDown(form_handle(), page(), 0, 115, 58);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 115, 58);
   for (size_t i = 0; i < 10; ++i)
-    FORM_OnChar(form_handle(), page(), 'a' + i, 0);
+    FORM_OnChar(form_handle(), page.get(), 'a' + i, 0);
 
   // Mouse selection
-  FORM_OnLButtonDown(form_handle(), page(), 0, 128, 58);
-  FORM_OnMouseMove(form_handle(), page(), FWL_EVENTFLAG_ShiftKey, 152, 58);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 128, 58);
+  FORM_OnMouseMove(form_handle(), page.get(), FWL_EVENTFLAG_ShiftKey, 152, 58);
 
   // 12 == (2 * strlen(defgh)) + 2 (for \0\0)
-  ASSERT_EQ(12U, FORM_GetSelectedText(form_handle(), page(), nullptr, 0));
+  ASSERT_EQ(12U, FORM_GetSelectedText(form_handle(), page.get(), nullptr, 0));
 
   uint16_t buf[6];
   ASSERT_EQ(12U,
-            FORM_GetSelectedText(form_handle(), page(), &buf, sizeof(buf)));
+            FORM_GetSelectedText(form_handle(), page.get(), &buf, sizeof(buf)));
   EXPECT_EQ("defgh", GetPlatformString(buf));
 
   // TODO(hnakashima): This is incorrect. Visually 'abcdefgh' are selected.
   const char kDraggedMD5[] = "f131526c8edd04e44de17b2647ec54c8";
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(page_bitmap.get(), 612, 792, kDraggedMD5);
   }
 }
@@ -124,20 +119,21 @@
   }
 
   CreateAndInitializeFormPDF("xfa/email_recommended.pdf");
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
   const char kBlankMD5[] = "8dda78a3afaf9f7b5210eb81cacc4600";
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(page_bitmap.get(), 612, 792, kBlankMD5);
   }
 
-  FORM_OnLButtonDown(form_handle(), page(), 0, 115, 58);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 115, 58);
   for (size_t i = 0; i < 10; ++i)
-    FORM_OnChar(form_handle(), page(), 'a' + i, 0);
+    FORM_OnChar(form_handle(), page.get(), 'a' + i, 0);
 
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(page_bitmap.get(), 612, 792, kEmailRecommendedFilledChecksum);
   }
 }
@@ -149,16 +145,17 @@
   }
 
   CreateAndInitializeFormPDF("xfa/email_recommended.pdf");
-  FORM_OnLButtonDown(form_handle(), page(), 0, 115, 58);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 115, 58);
   for (size_t i = 0; i < 5; ++i)
-    FORM_OnChar(form_handle(), page(), 'a' + i, 0);
-  FORM_OnChar(form_handle(), page(), '\r', 0);
+    FORM_OnChar(form_handle(), page.get(), 'a' + i, 0);
+  FORM_OnChar(form_handle(), page.get(), '\r', 0);
   for (size_t i = 5; i < 10; ++i)
-    FORM_OnChar(form_handle(), page(), 'a' + i, 0);
+    FORM_OnChar(form_handle(), page.get(), 'a' + i, 0);
 
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(page_bitmap.get(), 612, 792, kEmailRecommendedFilledChecksum);
   }
 }
@@ -166,13 +163,14 @@
 // Disabled due to flakiness.
 TEST_F(CFWLEditEmbedderTest, DISABLED_FillWithNewLineWithMultiline) {
   CreateAndInitializeFormPDF("xfa/xfa_multiline_textfield.pdf");
-  FORM_OnLButtonDown(form_handle(), page(), 0, 115, 58);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 115, 58);
 
   for (size_t i = 0; i < 5; ++i)
-    FORM_OnChar(form_handle(), page(), 'a' + i, 0);
-  FORM_OnChar(form_handle(), page(), '\r', 0);
+    FORM_OnChar(form_handle(), page.get(), 'a' + i, 0);
+  FORM_OnChar(form_handle(), page.get(), '\r', 0);
   for (size_t i = 5; i < 10; ++i)
-    FORM_OnChar(form_handle(), page(), 'a' + i, 0);
+    FORM_OnChar(form_handle(), page.get(), 'a' + i, 0);
 
   // Should look like:
   // abcde
@@ -184,12 +182,12 @@
     const char kFilledMultilineMD5[] = "a5654e027d8b1667c20f3b86d1918003";
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(page_bitmap.get(), 612, 792, kFilledMultilineMD5);
   }
 
   for (size_t i = 0; i < 4; ++i)
-    FORM_OnKeyDown(form_handle(), page(), FWL_VKEY_Left, 0);
+    FORM_OnKeyDown(form_handle(), page.get(), FWL_VKEY_Left, 0);
 
   // Should look like:
   // abcde
@@ -198,7 +196,7 @@
   // Two backspaces is a workaround because left arrow does not behave well
   // in the first character of a line. It skips back to the previous line.
   for (size_t i = 0; i < 2; ++i)
-    FORM_OnChar(form_handle(), page(), '\b', 0);
+    FORM_OnChar(form_handle(), page.get(), '\b', 0);
 
   // Should look like:
   // abcde|ghij
@@ -209,7 +207,7 @@
     const char kMultilineBackspaceMD5[] = "a2f1dcab92bb1fb7c2f9ccc70100c989";
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(page_bitmap.get(), 612, 792, kMultilineBackspaceMD5);
   }
 }
@@ -221,23 +219,24 @@
   }
 
   CreateAndInitializeFormPDF("xfa/xfa_date_time_edit.pdf");
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
 
   // Give focus to date time widget, creating down-arrow button.
-  FORM_OnLButtonDown(form_handle(), page(), 0, 115, 58);
-  FORM_OnLButtonUp(form_handle(), page(), 0, 115, 58);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 115, 58);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 115, 58);
   const char kSelectedMD5[] = "1036b8837a9dba75c6bd8f9347ae2eb2";
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(page_bitmap.get(), 612, 792, kSelectedMD5);
   }
 
   // Click down-arrow button, bringing up calendar widget.
-  FORM_OnLButtonDown(form_handle(), page(), 0, 446, 54);
-  FORM_OnLButtonUp(form_handle(), page(), 0, 446, 54);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 446, 54);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 446, 54);
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
 
     // TODO(tsepez): hermetic fonts.
     // const char kCalendarOpenMD5[] = "02de64e7e83c82c1ef0ae484d671a51d";
@@ -245,11 +244,11 @@
   }
 
   // Click on date on calendar, putting result into field as text.
-  FORM_OnLButtonDown(form_handle(), page(), 0, 100, 162);
-  FORM_OnLButtonUp(form_handle(), page(), 0, 100, 162);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 100, 162);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 100, 162);
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
 
     // TODO(tsepez): hermetic fonts.
     // const char kFilledMD5[] = "1bce66c11f1c87b8d639ce0076ac36d3";
@@ -259,23 +258,26 @@
 
 TEST_F(CFWLEditEmbedderTest, ImageEditTest) {
   CreateAndInitializeFormPDF("xfa/xfa_image_edit.pdf");
-  FORM_OnLButtonDown(form_handle(), page(), 0, 115, 58);
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 115, 58);
   const char* filled_checksum = []() {
     if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
       return "23658ed124114f05518372d41c80e41b";
     }
     return "101cf6223fa2403fba4c413a8310ab02";
   }();
-  ScopedFPDFBitmap page_bitmap = RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+  ScopedFPDFBitmap page_bitmap =
+      RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
   CompareBitmap(page_bitmap.get(), 612, 792, filled_checksum);
 }
 
 TEST_F(CFWLEditEmbedderTest, ComboBoxTest) {
   CreateAndInitializeFormPDF("xfa/xfa_combobox.pdf");
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
 
   // Give focus to widget.
-  FORM_OnLButtonDown(form_handle(), page(), 0, 115, 58);
-  FORM_OnLButtonUp(form_handle(), page(), 0, 115, 58);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 115, 58);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 115, 58);
   {
     const char* filled_checksum = []() {
       if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
@@ -284,37 +286,37 @@
       return "dad642ae8a5afce2591ffbcabbfc58dd";
     }();
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     CompareBitmap(page_bitmap.get(), 612, 792, filled_checksum);
   }
 
   // Click on down-arrow button, dropdown list appears.
-  FORM_OnLButtonDown(form_handle(), page(), 0, 438, 53);
-  FORM_OnLButtonUp(form_handle(), page(), 0, 438, 53);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 438, 53);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 438, 53);
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     // TODO(tsepez): hermetic fonts.
     // const char kFilledMD5[] = "dad642ae8a5afce2591ffbcabbfc58dd";
     // CompareBitmap(page_bitmap.get(), 612, 792, kFilledMD5);
   }
 
   // Enter drop-down list, selection highlighted.
-  FORM_OnMouseMove(form_handle(), page(), 0, 253, 107);
+  FORM_OnMouseMove(form_handle(), page.get(), 0, 253, 107);
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     // TODO(tsepez): hermetic fonts.
     // const char kFilledMD5[] = "dad642ae8a5afce2591ffbcabbfc58dd";
     // CompareBitmap(page_bitmap.get(), 612, 792, kFilledMD5);
   }
 
   // Click on selection, putting result into field.
-  FORM_OnLButtonDown(form_handle(), page(), 0, 253, 107);
-  FORM_OnLButtonUp(form_handle(), page(), 0, 253, 107);
+  FORM_OnLButtonDown(form_handle(), page.get(), 0, 253, 107);
+  FORM_OnLButtonUp(form_handle(), page.get(), 0, 253, 107);
   {
     ScopedFPDFBitmap page_bitmap =
-        RenderLoadedPageWithFlags(page(), FPDF_ANNOT);
+        RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT);
     // TODO(tsepez): hermetic fonts.
     // const char kFilledMD5[] = "dad642ae8a5afce2591ffbcabbfc58dd";
     // CompareBitmap(page_bitmap.get(), 612, 792, kFilledMD5);
