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

v64noz0r  于 2022-11-10  发布在  Python
关注(0)|答案(6)|浏览(151)

我正试着只用键盘放大和缩小Chrome(Selum WebDriver)。我试过了

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

但这并不奏效。需要用Python回答。

kfgdxczn

kfgdxczn1#

我只是在和这件事作斗争。我设法找到了对我有用的东西,希望它对你也有用:

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

有‘Zoom%’=任何您想要的缩放级别。(例如‘67%’)

yqkkidmi

yqkkidmi2#

环境:

  • Selence 3.6.0
  • chromeDRIVER 2.33
  • Chrome版本62.0.3202.75(官方版本)(64位)
  • MacOS Sierra 10.12.6

我尝试了过去人们在其他问题中提出的方法(没有使用css)。例如,此问题中的答案:Selenium webdriver zoom in/out page content
或者这个:Test zoom levels of page on browsers
但没有成功。
所以,我想:如果没有捷径,还有什么不同的方式可以做到这一点呢?
我们的想法是使用“Chrome://设置/”页面来更改缩放:

好的,我知道,例如从Going through Chrome://settings by Selenium,每个设置都应该在ChromeOptions中设置。
this question我注意到,在list of preferences中,唯一的参数(我认为)可能是:

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

我试过了,但没有成功。
我想重复一遍,我知道这不是正确的方法(不同的浏览器版本会有所不同),但它是有效的,至少对我理解如何进入带有 selenium 的影子根元素很有用。
以下方法返回影子根内的元素:

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/")

编辑

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

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

3qpi33ja

3qpi33ja3#

火狐为我提供解决方案,
Zoom body browser
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";')

oknwwptz

oknwwptz4#

可以,您可以调用Chrome驱动程序进行缩放,而不必使用css。Chrome DevTools协议查看器中包含了一些方法,其中一个是Input.synthesizePinchGesture,也就是放大/缩小。

为了便于使用,关于DevTools协议接口,我们将使用一个名为MyChromeDriver的类和webdriver.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')

1.设置我们的WebDriverget某个页面:

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

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

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/
基于这个答案:用含 selenium 的Chrome截取全页屏幕

p3rjfoxz

p3rjfoxz5#

正如您提到的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浏览器。所以,你可能没有看到这一点。
1.放大和缩小Chrome浏览器:
413141331621之后,fullscreen()模式通过Selify-Java客户端支持到Zoom In,但还没有公开发布到PyPI

我可以看到它是执行的,但不是推送的。Selenium 3.7 (Python)即将面世。同步版本号的推送将包括这一点。

1.配置webdriver打开浏览器:
如果您的需求是在Full Screen模式下执行Test Suite,您可以始终使用**Options类,并使用--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')
vc9ivgsu

vc9ivgsu6#


# zoom in firefox browser

driver.get("about:preferences")
driver.execute_script("arguments[0].click();", driver.find_element(By.XPATH, "// [@id='defaultZoom']"))
ActionChains(driver).click(driver.find_element(By.XPATH, "//*[@value='50']")).perform()

相关问题