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

Day*_*nda 10 python keyboard selenium

我试图只使用键盘放大和放大Chrome(selenium webdriver).我试过了 -

from selenium.webdriver.common.keys import Keys
driver.find_element_by_tag_name("body").send_keys(Keys.CONTROL,Keys.SUBTRACT). 
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*Ben 10

我只是在努力解决这个问题.我设法找到适合我的东西,希望它适合你:

driver.execute_script("document.body.style.zoom='zoom %'")
Run Code Online (Sandbox Code Playgroud)

'zoom%'=您想要的任何缩放级别.(例如'67%')

  • 对我来说,它不适用于Selenium 2.53和Firefox (6认同)

Dav*_*tti 6

环境:

  • 硒3.6.0
  • chromedriver 2.33
  • Chrome版本62.0.3202.75(官方版)(64位)
  • macOS Sierra 10.12.6

我尝试了过去人们在其他问题中提出的方法(不使用CSS).例如,这个问题的答案:Selenium webdriver放大/缩小页面内容.

或者:在浏览器上测试页面的缩放级别

没有成功.

所以,我想:如果没有快捷方式,那可能是另一种方式呢?

我们的想法是使用"chrome:// settings /"页面来改变缩放:

在此输入图像描述

好的,我知道,例如来自Selenium的Chrome浏览器设置://应该在ChromeOptions中设置每个设置.

这个问题我注意到,在偏好列表中,唯一的参数(我认为)可能是:

// Double that indicates the default zoom level.
const char kPartitionDefaultZoomLevel[] = "partition.default_zoom_level";
Run Code Online (Sandbox Code Playgroud)

我试过了,没有成功.

我想重复一遍,我知道这不是正确的方法(并且对于不同的浏览器版本会有所不同),但它起作用,至少对我来说理解如何使用selenium进入阴影根元素是有用的.

以下方法返回阴影根中的元素:

def expand_shadow_element(element):
    shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root
Run Code Online (Sandbox Code Playgroud)

很有用,因为在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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最后:

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

整个代码:

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/")
Run Code Online (Sandbox Code Playgroud)

编辑

正如@Florent B在评论中所建议那样,我们可以通过以下方式获得相同的结果:

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

在此输入图像描述

  • 您可以简单地在页面中调用 API:`driver.get("chrome://settings/")`,然后调用 `driver.execute_script("chrome.settingsPrivate.setDefaultZoom(1.5);")`,而不是更新 DOM 。 (5认同)

Col*_*ole 5

是的,您可以调用 Chrome 驱动程序进行缩放,而无需使用 CSS。Chrome DevTools 协议查看器中封装了一些方法,一种是Input.synthesizePinchGesture放大/缩小。

为便于使用,关于 DevTools 协议 API,我们将使用一个名为MyChromeDriverwithwebdriver.Chrome的类作为元类和一种将这些命令发送到 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')
Run Code Online (Sandbox Code Playgroud)

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

webdriver = MyChromeDriver()
webdriver.get("https://google.com")
Run Code Online (Sandbox Code Playgroud)

2.Input.synthesizePinchGesture通过我们的新方法向Chrome 发送命令及其参数send_cmd

webdriver.send_cmd('Input.synthesizePinchGesture', {
                        'x': 0,
                        'y': 0,
                        'scaleFactor': 2,
                        'relativeSpeed': 800, # optional
                        'gestureSourceType': 'default' # optional
                    })
Run Code Online (Sandbox Code Playgroud)

3. 瓦拉!调用 Chrome 的缩放: 在此处输入图片说明

作为旁注,您可以使用大量其他命令send_cmd。在这里找到它们:https : //chromedevtools.github.io/devtools-protocol/

基于此答案:在 Chrome 中使用 Selenium 拍摄整页屏幕截图


小智 5

我的Firefox解决方案,

缩放身体浏览器

zoom是非标准属性,请改用transform(演示):

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";')

  • 我发现这个解决方案很有用,并且没有发现 Firefox 上有类似的问题,所以很高兴这个问题在这里。 (2认同)