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.