Issue trying to set zoom on google (chromedriver, selenium, python)

Viewed 1575

I am trying to set google chrome zoom to 80%.


from selenium import webdriver

class bot:

    def __init__(self):
        self.driver = webdriver.Chrome("chromedriver path here")

    def zoomOut(self):
        driver = self.driver
        driver.get('chrome://settings/')
        driver.find_element_by_xpath('//*[@id="zoomLevel"]').sendKeys('80').sendKeys(Keys.ENTER)

if __name__ == "__main__":
    bot = bot()
    bot.zoomOut()

Would appreciate any help on how to solve this issue.

Update: I get an error on finding the xpath to be able to set the zoom value.

1 Answers

This is an interesting question. This is difficult because the settings elements are very nested in a bunch of shadow roots (a "sub dom", similar to an iFrame). It is nested very deep, and is a bit of a pain to get to. Here is some JS code that gets us there:

var selectBox = document.querySelector("settings-ui").shadowRoot.querySelector("#main").shadowRoot.querySelector("settings-basic-page").shadowRoot.querySelector("settings-appearance-page").shadowRoot.querySelector("#zoomLevel");

var changeEvent = new Event("change");

selectBox.value = arguments[0];
selectBox.dispatchEvent(changeEvent); // Trigger change event to change the zoom

We can then put this in a python method to change the zoom.

class Bot:
    def change_zoom(self, new_zoom):
        """
        :param new_zoom: zoom level as a percentage
        """
        change_js = """
        var selectBox = document.querySelector("settings-ui").shadowRoot.querySelector("#main").shadowRoot.querySelector("settings-basic-page").shadowRoot.querySelector("settings-appearance-page").shadowRoot.querySelector("#zoomLevel");

        var changeEvent = new Event("change");

        selectBox.value = arguments[0];
        selectBox.dispatchEvent(changeEvent);
        """

        self.driver.get("chrome://settings/")
        new_zoom = round(new_zoom / 100, 2)
        self.driver.execute_script(change_js, new_zoom)

I am very sure there is an easier way to access these deep nested elements, but this works well for me.

Related