我们可以在 python selenium webdriver 中缩放浏览器 window 吗?

Can we Zoom the browser window in python selenium webdriver?

我正在尝试仅使用键盘放大和缩小 Chrome(selenium webdriver)。我试过了--

from selenium.webdriver.common.keys import Keys
driver.find_element_by_tag_name("body").send_keys(Keys.CONTROL,Keys.SUBTRACT). 

但它不起作用。需要在 python 中回答。

我正为此苦苦挣扎。我设法找到了适合我的东西,希望对你有用:

driver.execute_script("document.body.style.zoom='zoom %'")

有 'zoom%' = 您想要的任何缩放级别。 (例如“67%”)

正如您提到的 Need it to work in Chrome. The current solutions are only for Firefox,这里有一些更新和选项:

  1. 缩放 CSS :

    driver.execute_script("document.body.style.zoom='150%'")
    

    这个选项对我有用。但它会缩放 CSS,而不是 Chrome 浏览器。所以你可能没有在看那个。

  2. 放大和缩小 Chrome 浏览器:

4131, 4133 and 1621 之后 fullscreen() 模式通过 Selenium-Java 客户端支持 Zoom In 但尚未公开发布到 PyPI.

I can see it's implemented but not pushed. Selenium 3.7 (Python) will be out soon. The push to sync version numbers will include that.

  1. 配置webdriver打开浏览器:

如果你的要求是在Full Screen模式下执行Test Suite,你总是可以使用Options Class并使用 --kiosk 参数配置 webdriver 实例,如下所示:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--kiosk")
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get('https://www.google.co.in')

是的,您可以调用 Chrome 驱动程序进行缩放,而无需使用 CSS。 Chrome DevTools Protocol Viewer 中打包了一些方法,其中之一是 Input.synthesizePinchGesture 又名缩放 in/out.

为了便于使用,关于 DevTools 协议 API,我们将使用一个名为 MyChromeDriver 的 class webdriver.Chrome 作为元class 和将这些命令发送到 Chrome:

的新方法
# selenium
from selenium import webdriver
# json
import json

class MyChromeDriver(webdriver.Chrome):
    def send_cmd(self, cmd, params):
        resource = "/session/%s/chromium/send_command_and_get_result" % self.session_id
        url = self.command_executor._url + resource
        body = json.dumps({'cmd':cmd, 'params': params})
        response = self.command_executor._request('POST', url, body)
        return response.get('value')

1.设置我们的 webdriverget 一些页面:

webdriver = MyChromeDriver()
webdriver.get("https://google.com")

2。通过我们的新方法 send_cmd:

发送 Chrome Input.synthesizePinchGesture 命令 及其 parameters
webdriver.send_cmd('Input.synthesizePinchGesture', {
                        'x': 0,
                        'y': 0,
                        'scaleFactor': 2,
                        'relativeSpeed': 800, # optional
                        'gestureSourceType': 'default' # optional
                    })

3。瓦拉! Chrome 的缩放被调用:

附带说明一下,send_cmd 还可以使用许多其他命令。在这里找到它们:https://chromedevtools.github.io/devtools-protocol/

基于这个答案:

环境:

  • 硒 3.6.0
  • chrome驱动程序 2.33
  • Chrome 版本 62.0.3202.75(正式版)(64 位)
  • macOS 塞拉利昂 10.12.6

我尝试了过去人们在其他问题中建议的方法(不使用 CSS)。比如这道题的答案:Selenium webdriver zoom in/out page content.

或者这样:Test zoom levels of page on browsers

没有成功。

所以,我想:如果不使用快捷方式,还有什么不同的方法可以做到这一点?

想法是使用“chrome://settings/”页面来更改缩放:

好的,我知道,例如 , that every settings should be set in the ChromeOptions

来自 I noticed that in the list of preferences 的唯一参数(我认为)可能是:

// Double that indicates the default zoom level.
const char kPartitionDefaultZoomLevel[] = "partition.default_zoom_level";

我试过了,没有成功。

我想重复一遍,我知道这不是正确的方法(不同的浏览器版本会有所不同),但它有效,至少对我了解如何进入用硒遮蔽根元素。

下面的方法return影子根里面的元素:

def expand_shadow_element(element):
    shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root

它很有用,因为在 chrome://settings/ 页面中有影子根元素。

为了在我的浏览器中执行此操作,这是路径:

root1=driver.find_element_by_xpath("*//settings-ui")
shadow_root1 = expand_shadow_element(root1)
container= shadow_root1.find_element_by_id("container")

root2= container.find_element_by_css_selector("settings-main")
shadow_root2 = expand_shadow_element(root2)

root3=shadow_root2.find_element_by_css_selector("settings-basic-page")

shadow_root3 = expand_shadow_element(root3)
basic_page = shadow_root3.find_element_by_id("basicPage")

settings_section= basic_page.find_element_by_xpath(".//settings-section[@section='appearance']")

root4= settings_section.find_element_by_css_selector("settings-appearance-page")
shadow_root4=expand_shadow_element(root4)

最后:

settings_animated_pages= shadow_root4.find_element_by_id("pages")
neon_animatable=settings_animated_pages.find_element_by_css_selector("neon-animatable")

zoomLevel= neon_animatable.find_element_by_xpath(".//select[@id='zoomLevel']/option[@value='0.5']")
zoomLevel.click()

完整代码:

driver = webdriver.Chrome(executable_path=r'/pathTo/chromedriver')

def expand_shadow_element(element):
    shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root


driver.get('chrome://settings/')

root1=driver.find_element_by_xpath("*//settings-ui")
shadow_root1 = expand_shadow_element(root1)
container= shadow_root1.find_element_by_id("container")

root2= container.find_element_by_css_selector("settings-main")
shadow_root2 = expand_shadow_element(root2)

root3=shadow_root2.find_element_by_css_selector("settings-basic-page")

shadow_root3 = expand_shadow_element(root3)
basic_page = shadow_root3.find_element_by_id("basicPage")

settings_section= basic_page.find_element_by_xpath(".//settings-section[@section='appearance']")

root4= settings_section.find_element_by_css_selector("settings-appearance-page")
shadow_root4=expand_shadow_element(root4)

settings_animated_pages= shadow_root4.find_element_by_id("pages")
neon_animatable=settings_animated_pages.find_element_by_css_selector("neon-animatable")

zoomLevel= neon_animatable.find_element_by_xpath(".//select[@id='zoomLevel']/option[@value='0.5']")
zoomLevel.click()


driver.get("https://www.google.co.uk/")

编辑

如评论中的 by @Florent B,我们可以简单地获得相同的结果:

driver.get('chrome://settings/')
driver.execute_script('chrome.settingsPrivate.setDefaultZoom(1.5);')
driver.get("https://www.google.co.uk/")

我的 firefox 解决方案,

Zoom body browser

缩放是 non-standard 属性,请改用变换(演示):

driver.execute_script("document.body.style.transform = 'scale(0.8)'")

https://github.com/SeleniumHQ/selenium/issues/4244

driver.execute_script('document.body.style.MozTransform = "scale(0.50)";')

driver.execute_script('document.body.style.MozTransformOrigin = "0 0";')