鱼C论坛

 找回密码
 立即注册
查看: 678|回复: 4

[已解决]selenium执行一句JS的问题

[复制链接]
发表于 2023-9-23 20:58:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大哥,新鱼今天遇到一个奇怪的问题,代码很简短,就是用selenium执行一句JS,具体如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service


# 设置option参数
option = webdriver.ChromeOptions()
option.add_argument('--no-sandbox') # 最高权限运行
option.add_argument('--ignore-certificate-errors') # 禁用扩展插件并实现窗口最大化
option.add_experimental_option('excludeSwitches',['enable-automation','enable-logging']) # 反爬虫检测,禁console回显
option.add_experimental_option("prefs",{"credentials_enable_service":False,"profile.password_manager_enabled":False}) #禁用“保存密码”弹出窗口
option.add_argument('--headless') # 无头模式
option.add_argument('--disable-gpu') # 禁用GPU渲染
option.add_argument('--incognito') # 无痕隐身模式
option.add_argument("disable-cache") # 禁用缓存
option.binary_location = r'D:\Program Files (x86)\Chrome for Testing\chrome.exe' # 手动指定浏览器位置及↓↓↓驱动↓↓↓位置

browser = webdriver.Chrome(options=option, service=Service(r'D:\Program Files (x86)\Chrome for Testing\chromedriver.exe'))

scr_size = browser.execute_script("return screen.width+'×'+screen.height;")
print('当前分辨率:'+scr_size)


上述代码在我刚刚开始运行的时候是可以打印我笔记本正确的分辨率:"当前分辨率:1600×900"
后来不知道修改了什么代码,再运行就一直是打印错误的分辨率了:"当前分辨率:800×600"
各位也可以在自己的电脑上测试这段代码,看看能不能打印正确结果
在网页的F12里面直接执行screen.width+'×'+screen.height是能返回正确结果的,转一手就出问题了?

我用的是Chrome for Testing 116.0.5845.96版本,驱动也是116.0.5845.96,完全配套,并且已经正常运行过一段时间了
询问了一下GPT,结果是:
你的问题可能是由多个因素引起的,你可以尝试以下的排查方案:
检查Chrome浏览器和ChromeDriver的版本:确保你的Chrome浏览器和ChromeDriver都是最新版本。有时,如果版本不匹配,可能会导致一些意料之外的行为。
检查你的代码是否修改了浏览器窗口的大小:你的代码中并没有明确修改浏览器窗口大小的语句,但如果在代码中的其他地方有修改窗口大小的语句,可能会影响到获取的分辨率。
检查你的显示器分辨率是否改变:如果你的显示器的分辨率在你运行代码的过程中被改变,那么获取的分辨率也会发生变化。
检查Chrome设置:确保Chrome的设置中没有固定窗口大小或者改变默认分辨率的设置。
尝试使用browser2.maximize_window()方法:在你的代码中,你使用了--start-maximized选项,这个选项在某些版本的Chrome中可能无法正常工作。你可以尝试用browser2.maximize_window()方法替代这个选项。

我已经尝试过参数中option.add_argument('--start-maximized'),也尝试过browser.maximize_window(),都不能最大化窗口,只能先获得屏幕分辨率在指定窗口大小,因为在不同电脑上运行,分辨率是不固定的
补充一下,我目前是用python其他库来获取分辨率,但是这样会增加打包后的体积,能省则省吧....

所以GPT的这些回答建议都没什么用,还得来论坛求助各位大哥,我的代码要怎么改才可以打印出正确的分辨率呢?
最佳答案
2023-9-23 20:58:58
根据你提供的代码,我注意到你在创建Chrome浏览器实例时使用了无头模式(--headless),这可能导致无法获取正确的分辨率信息。无头模式是一种在后台运行浏览器的方式,它没有实际的可视化窗口。因此,获取的分辨率可能会受到限制。

如果你需要获取准确的屏幕分辨率信息,建议不要使用无头模式。你可以尝试删除以下行代码,将浏览器运行在有界面的模式下:

  1. option.add_argument('--headless')  # 无头模式
复制代码


重新运行代码,看看是否能够获取正确的分辨率。

另外,如果你想最大化浏览器窗口并获取分辨率,你可以尝试使用browser.maximize_window()方法,而不是在启动选项中添加--start-maximized参数。修改代码如下:

  1. # 启动浏览器
  2. browser = webdriver.Chrome(options=option, service=Service(r'D:\Program Files (x86)\Chrome for Testing\chromedriver.exe'))
  3. browser.maximize_window()  # 最大化浏览器窗口
  4. scr_size = browser.execute_script("return screen.width+'×'+screen.height;")
  5. print('当前分辨率:' + scr_size)
复制代码


希望这些修改能够解决你的问题。如果问题仍然存在,请提供更多的细节或错误信息,以便我能更好地帮助你。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-23 20:58:50 | 显示全部楼层
问题可能出在浏览器窗口大小的设置上。你可以尝试使用以下代码来设置浏览器窗口大小,然后再执行JavaScript获取分辨率:

  1. browser.set_window_size(1366, 768) # 设置浏览器窗口大小
  2. scr_size = browser.execute_script("return screen.width+'×'+screen.height;")
  3. print('当前分辨率:'+scr_size)
复制代码


如果还是无法获取正确的分辨率,可以尝试使用 browser.maximize_window() 方法来最大化浏览器窗口,然后再执行JavaScript获取分辨率:

  1. browser.maximize_window() # 最大化浏览器窗口
  2. scr_size = browser.execute_script("return screen.width+'×'+screen.height;")
  3. print('当前分辨率:'+scr_size)
复制代码


另外,你也可以尝试使用 browser.execute_script("return window.outerWidth+'×'+window.outerHeight;") 来获取浏览器窗口的大小,这样可以避免受到浏览器窗口大小的影响。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-23 20:58:58 | 显示全部楼层    本楼为最佳答案   
根据你提供的代码,我注意到你在创建Chrome浏览器实例时使用了无头模式(--headless),这可能导致无法获取正确的分辨率信息。无头模式是一种在后台运行浏览器的方式,它没有实际的可视化窗口。因此,获取的分辨率可能会受到限制。

如果你需要获取准确的屏幕分辨率信息,建议不要使用无头模式。你可以尝试删除以下行代码,将浏览器运行在有界面的模式下:

  1. option.add_argument('--headless')  # 无头模式
复制代码


重新运行代码,看看是否能够获取正确的分辨率。

另外,如果你想最大化浏览器窗口并获取分辨率,你可以尝试使用browser.maximize_window()方法,而不是在启动选项中添加--start-maximized参数。修改代码如下:

  1. # 启动浏览器
  2. browser = webdriver.Chrome(options=option, service=Service(r'D:\Program Files (x86)\Chrome for Testing\chromedriver.exe'))
  3. browser.maximize_window()  # 最大化浏览器窗口
  4. scr_size = browser.execute_script("return screen.width+'×'+screen.height;")
  5. print('当前分辨率:' + scr_size)
复制代码


希望这些修改能够解决你的问题。如果问题仍然存在,请提供更多的细节或错误信息,以便我能更好地帮助你。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-9-23 20:59:11 | 显示全部楼层
根据您的描述,您希望通过Selenium执行一句JS来获取当前屏幕的分辨率,并打印出正确的结果。以下是可能导致问题的几个方面以及相应的解决方案:

1. 检查Chrome浏览器和ChromeDriver的版本:确保您使用的Chrome浏览器和ChromeDriver版本是最新的,以确保兼容性和稳定性。

2. 检查代码是否修改了浏览器窗口大小:在您提供的代码中,并没有明确的窗口大小修改语句。但是如果代码中的其他部分修改了窗口大小,可能会影响到获取的分辨率。请检查代码中是否有其他窗口大小相关的操作,并确保没有影响到获取分辨率的地方。

3. 检查显示器分辨率是否改变:如果在运行代码的过程中,您的显示器分辨率发生了改变,那么获取到的分辨率也会相应发生变化。请确保在运行代码期间,显示器分辨率保持不变。

4. 检查Chrome设置:请检查Chrome浏览器的设置,确保没有固定窗口大小或者改变默认分辨率的设置。这些设置可能会影响到获取的分辨率。

5. 使用browser.maximize_window()方法替代--start-maximized选项:根据您的描述,--start-maximized选项在某些版本的Chrome中可能无法正常工作。您可以尝试使用browser.maximize_window()方法来最大化窗口,代替该选项。示例代码如下:
  1. # 创建浏览器对象
  2. browser = webdriver.Chrome(options=option, service=Service(r'D:\Program Files (x86)\Chrome for Testing\chromedriver.exe'))
  3. # 最大化窗口
  4. browser.maximize_window()
  5. # 执行JS获取分辨率
  6. scr_size = browser.execute_script("return screen.width+'×'+screen.height;")
  7. print('当前分辨率:'+scr_size)
复制代码

通过以上解决方案,您可以尝试修改代码以获取正确的屏幕分辨率。希望对您有帮助!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-23 21:20:32 | 显示全部楼层
陶远航 发表于 2023-9-23 20:58
根据你提供的代码,我注意到你在创建Chrome浏览器实例时使用了无头模式(--headless),这可能导致无法获取 ...

就是无头模式的问题,但是我必须用无头,哎,只能先用其他库获取分辨率了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 08:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表