diff --git a/client/common_lib/ui_utils.py b/client/common_lib/ui_utils.py
index e2bed47..e0fe6c3 100644
--- a/client/common_lib/ui_utils.py
+++ b/client/common_lib/ui_utils.py
@@ -175,13 +175,14 @@
             {name: %s, role: %s}}).map(node => node.%s)""" % (name, role, attr)
         return self.ext.EvaluateJavaScript(new_promise, promise=True)
 
-    def get_name_role_list(self):
+    def get_name_role_list(self, name=None, role=None):
         """
         Return [{}, {}] containing the name/role of everything on screen.
 
         """
-        name = self.REGEX_ALL
-        role = self.REGEX_ALL
+        name = self.REGEX_ALL if name is None else name
+        role = self.REGEX_ALL if role is None else self._format_obj(role,
+                                                                    False)
 
         new_promise = self.PROMISE_TEMPLATE % """root.findAll({attributes:
             {name: %s, role: %s}}).map(node =>
diff --git a/client/common_lib/ui_utils_helpers.py b/client/common_lib/ui_utils_helpers.py
index 9dd13cd..15de46b 100644
--- a/client/common_lib/ui_utils_helpers.py
+++ b/client/common_lib/ui_utils_helpers.py
@@ -1,14 +1,16 @@
 from autotest_lib.client.common_lib import error
 from autotest_lib.client.common_lib import ui_utils
 from autotest_lib.client.cros.input_playback import keyboard
+import logging
 
 
-class UI_Helper_Handler(object):
+class UIPrinterHelper(object):
+    """Helper lib for ChromeOS UI automation."""
 
     def __init__(self, ui_handler=None, chrome=None):
         """ui_handler or chrome must be provided. ui_handler is an already
         existing ui object."""
-        if not self.ui_handler and chrome:
+        if not ui_handler and chrome:
             self.ui = ui_utils.UI_Handler()
             self.ui.start_ui_root(chrome)
         elif not chrome and ui_handler:
@@ -28,45 +30,89 @@
         if self._keyboard:
             self._keyboard.close()
 
-    def open_printer_menu(self):
-        self.ui.doDefault_on_obj('Chrome')
+    def open_printer_menu(self, retry=0):
+        """Open the printer menu via the Chrome Dropdown."""
+        if not self._is_chrome_menu_open():
+            self.ui.doDefault_on_obj('Chrome')
         self.ui.wait_for_ui_obj('/Print/', role='menuItem', isRegex=True)
         self.ui.doDefault_on_obj('/Print/', isRegex=True)
-        self.wait_for_print_ready()
+        if retry == 0:
+            try:
+                self.wait_for_print_ready()
+            except error.TestError:
+                self.open_printer_menu(retry=1)
+        else:
+            self.wait_for_print_ready()
 
     def wait_for_print_ready(self):
-        self.ui.wait_for_ui_obj('Fit to width', role='button')
+        """Wait for the print page to fully load."""
+        try:
+            self.ui.wait_for_ui_obj('Fit to width', role='button', timeout=30)
+        except:
+            logging.info("Missing {} in {}".format("Fit to width", self.ui.get_name_role_list()))
+            raise error.TestError("Fit to width no load")
         self.ui.wait_for_ui_obj('Loading preview', remove=True)
 
     def open_see_more_print_sub_menu(self):
         """For now must pivot there with the KB."""
-        if not self.is_print_menu_open():
-            raise error.TestError(
-                "Cannot open See more print menu when print screen not open")
         if not self._keyboard:
             self._keyboard = keyboard.Keyboard()
-        for i in range(4):
-            self._keyboard.press_key('tab')
-        self._keyboard.press_key('down')
+
+        # Some tests have a notification which causes the chrome menu
+        # to remain open, and loose focus on the print page.
+        if self._is_chrome_menu_open():
+            self._keyboard.press_key("escape")
+            self.verify_print_menu_open()
+
+        self.ui.doDefault_on_obj(self._node_name_above_see_more_menu())
+        self._keyboard.press_key("down")
         self._keyboard.press_key('enter')
 
+    def _node_name_above_see_more_menu(self):
+        """
+        Return the name of the node above see more menu.
+
+        Right now "See More" is not directly clickable. There is investigation
+        being done as for why, but still no answer. For now we will instead
+        get the name of the node above it on the menu list, to "hover" over,
+        then down arrow + enter to select "See more".
+        There are some empty items that return off the list query, so we have
+        to filter these out. Additionally if for some odd reason we do not
+        find an item directly above the "See more" option, we will default
+        to "Save as PDF".
+
+        """
+        temp_list = []
+        menu_list = self.ui.get_name_role_list(role="menuListOption")
+        for i, item in enumerate(menu_list):
+            if item["name"]:
+                temp_list.append(item["name"])
+            if "See more" in item["name"]:
+                if len(temp_list) < 2:
+                    return "Save as PDF"  # Default item above
+                return temp_list[-2]  # First non empty item name prior.
+
+    def _is_chrome_menu_open(self):
+        """Return True if the chrome dropdown menu is still open."""
+        return self.ui.item_present("/Print/", role="menuItem", isRegex=True)
+
     def select_printer_from_see_more_menu(self, printer_name):
         """Click a printer from the "see more" sub menu within print page."""
         if not self.is_see_more_menu_open():
             raise error.TestError(
                 "Cannot select printer from sub menu as its not open.")
-        self.ui.wait_for_ui_obj(printer_name, role='cell')
-        self.ui.doDefault_on_obj(printer_name, role='cell')
-        self.ui.wait_for_ui_obj(printer_name, role='cell', remove=True)
+        # Easier to find via regex since the actual cell has the name twice.
+        if not self.is_str_regex(printer_name):
+            printer_name = self.make_str_regex(printer_name)
+        self.ui.wait_for_ui_obj(printer_name, isRegex=True, role='cell')
+        self.ui.doDefault_on_obj(printer_name, isRegex=True, role='cell')
+        self.ui.wait_for_ui_obj(printer_name, role='cell', remove=True, isRegex=True)
         # Wait for the "Setting up " loading icon to finish
         self.ui.wait_for_ui_obj('Setting up ', remove=True)
 
     def click_print(self, isPDF=False):
         """Click the print button. Click save if PDF."""
-        if not self.is_print_menu_open():
-            raise error.TestError(
-                "Cannot open See more print menu when print screen not open")
-
+        self.verify_print_menu_open()
         self.ui.doDefault_on_obj('Save' if isPDF else 'Print', role='button')
         if isPDF:
             pass  # TODO implement the save menu
@@ -82,3 +128,21 @@
     def is_print_menu_open(self):
         """Return True if the print menu is open."""
         return self.ui.item_present("Print", role="window")
+
+    def verify_print_menu_open(self):
+        """Verify print menu is open. If not raise TestError."""
+        if not self.is_print_menu_open():
+            raise error.TestError(
+                "Cannot open See more print menu when print screen not open")
+
+    def is_str_regex(self, var):
+        """Return True if the given var starts and ends with "/"."""
+        if len(var) < 1:
+            return False
+        if var[0] == "/" and var[-1] == "/":
+            return True
+        return False
+
+    def make_str_regex(self, var):
+        """Return the provided var with a leading and ending "/"."""
+        return ("/" + var + "/")
diff --git a/client/site_tests/platform_PrintJob/platform_PrintJob.py b/client/site_tests/platform_PrintJob/platform_PrintJob.py
index 6de42c2..9140acd 100644
--- a/client/site_tests/platform_PrintJob/platform_PrintJob.py
+++ b/client/site_tests/platform_PrintJob/platform_PrintJob.py
@@ -9,7 +9,7 @@
 from autotest_lib.client.bin import test, utils
 from autotest_lib.client.common_lib.cros import chrome
 from autotest_lib.client.cros.chameleon import chameleon
-from autotest_lib.client.cros.input_playback import input_playback
+from autotest_lib.client.common_lib import ui_utils_helpers
 
 _CHECK_TIMEOUT = 20
 _PRINTER_NAME = "HP OfficeJet g55"
@@ -28,76 +28,9 @@
     """
     version = 1
 
-    def warmup(self):
-        """Test setup."""
-        # Emulate keyboard to play back shortcuts and navigate.
-        # See input_playback README.
-        self._player = input_playback.InputPlayback()
-        self._player.emulate(input_type='keyboard')
-        self._player.find_connected_inputs()
-
-
     def cleanup(self):
         if hasattr(self, 'browser'):
             self.browser.close()
-        self._player.close()
-
-
-
-    def _open_print_dialog(self):
-        """Use keyboard shortcut to open print dialog."""
-        self._player.blocking_playback_of_default_file(
-            input_type='keyboard', filename='keyboard_ctrl+p')
-        time.sleep(_SHORT_WAIT)
-
-
-    def _press_tab(self):
-        """Use keyboard shortcut to press Tab."""
-        self._player.blocking_playback_of_default_file(
-            input_type='keyboard', filename='keyboard_tab')
-
-
-    def _press_down(self):
-        """Use keyboard shortcut to press down."""
-        self._player.blocking_playback_of_default_file(
-            input_type='keyboard', filename='keyboard_down')
-
-
-    def _press_shift_tab(self):
-        """Use keyboard shortcut to press Shift-Tab."""
-        self._player.blocking_playback_of_default_file(
-            input_type='keyboard', filename='keyboard_shift+tab')
-
-
-    def _press_enter(self):
-        """Use keyboard shortcut to press Enter."""
-        self._player.blocking_playback_of_default_file(
-            input_type='keyboard', filename='keyboard_enter')
-        time.sleep(_SHORT_WAIT)
-
-
-    def execute_print_job(self):
-        """Using keyboard imput navigate to print dialog and execute a job."""
-
-        # Open dialog and select 'See more'
-        self._open_print_dialog()
-        time.sleep(_SHORT_WAIT)
-
-        # Navigate to printer selection
-        for x in range(_STEPS_BETWEEN_CONTROLS):
-            self._press_tab()
-        self._press_down()
-        self._press_tab()
-        self._press_down()
-        self._press_enter()
-
-        # Go back to Print button
-        for x in range(_STEPS_BETWEEN_CONTROLS):
-            self._press_shift_tab()
-
-        # Send the print job
-        self._press_enter()
-
 
     def check_notification(self, notification):
         """Polls for successful print job notification"""
@@ -116,7 +49,6 @@
                 desc='Notification %s NOT found' % notification,
                 timeout=_CHECK_TIMEOUT, sleep_interval=_SHORT_WAIT)
 
-
     def navigate_to_pdf(self):
         """Navigate to the pdf page to print"""
         self.cr.browser.platform.SetHTTPServerDirectories(self.bindir)
@@ -127,7 +59,6 @@
                 timeout=_CHECK_TIMEOUT);
         time.sleep(_SHORT_WAIT)
 
-
     def run_once(self, host, args):
         """Run the test."""
 
@@ -148,7 +79,8 @@
             self.navigate_to_pdf()
             time.sleep(_SHORT_WAIT)
             logging.info('PDF file opened in browser!')
-            self.execute_print_job()
+            self.ui_helper = ui_utils_helpers.UIPrinterHelper(chrome=self.cr)
+            self.ui_helper.print_to_custom_printer("Chameleon " + _PRINTER_NAME)
             usb_printer.StartCapturingPrinterData()
             self.check_notification(_PRINTING_NOTIF)
             self.check_notification(_PRINTING_COMPLETE_NOTIF)
