Mac python+selenium 环境配置

本文介绍在Mac上安装Selenium的具体步骤,包括使用pip安装Python依赖包及浏览器驱动配置,并分享了PyCharm的破解教程。

才接触mac,以下是网上查找的资料,在我电脑上安装成功的过程,尽量都附上了原帖地址。

1.selenium安装

https://www.zhihu.com/question/30496889

网上好多教程都是跟这个差不多

 1.1下载pip 【python的安装包管理工具】

https://pypi.org/project/pip/ 

将下载好的都pip文件解压,打开终端,cd至该目录,执行sudo python setup.py install

1.2.返回主目录,执行sudo easy_inatall pip

第三步的时候,试了好几个命令都提示没有合适的版本,不知道是不是因为我有两个版本的python(mac自带python2.7,自己下载了python3.6)然后按照这篇文章安装成功的

https://blog.youkuaiyun.com/zxy987872674/article/details/53082896

pip list查看系统中的安装包,电脑中已经安装了pip和setuptools

1.3.执行 python3 -m pip install selenium

1.4火狐,谷歌浏览器的驱动安装(提示没有权限,用sudo)

https://github.com/mozilla/geckodriver/releases

sudo mv/cp downloads/geckodriver /usr/local/bin

2.pycharm破解

https://blog.youkuaiyun.com/weixin_37937646/article/details/79119540ß

2.1下载破解补丁文件,路径为:http://idea.lanyus.com/jar/JetbrainsCrack-2.7-release-str.jar

2.2将补丁放在安装包的/bin路径下,查看mac中的安装目录 ps -ef | grep pycharm

2.3 编辑/bin 目录下的pycharm.vmoptions

vi pycharm.vmoptions

输入 i进入编辑模式

插入-javaagent:../bin/JetbrainsCrack-2.7-release-str.jar

按esc ,在输入:wq! 保存退出

2.4然后打开idea,进入激活窗口此时需要选择 激活码 的激活方式,并输入如下激活码进行激活:

Activation Code:

BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiQUMiLCJwYWlkVXBUbyI6IjIwMTctMTEtMjMifSx7ImNvZGUiOiJETSIsInBhaWRVcFRvIjoiMjAxNy0xMS0yMyJ9LHsiY29kZSI6IklJIiwicGFpZFVwVG8iOiIyMDE3LTExLTIzIn0seyJjb2RlIjoiUlMwIiwicGFpZFVwVG8iOiIyMDE3LTExLTIzIn0seyJjb2RlIjoiV1MiLCJwYWlkVXBUbyI6IjIwMTctMTEtMjMifSx7ImNvZGUiOiJEUE4iLCJwYWlkVXBUbyI6IjIwMTctMTEtMjMifSx7ImNvZGUiOiJSQyIsInBhaWRVcFRvIjoiMjAxNy0xMS0yMyJ9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDE3LTExLTIzIn0seyJjb2RlIjoiREMiLCJwYWlkVXBUbyI6IjIwMTctMTEtMjMifSx7ImNvZGUiOiJEQiIsInBhaWRVcFRvIjoiMjAxNy0xMS0yMyJ9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDE3LTExLTIzIn0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMTctMTEtMjMifSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAxNy0xMS0yMyJ9XSwiaGFzaCI6IjQ3NzU1MTcvMCIsImdyYWNlUGVyaW9kRGF5cyI6MCwiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlfQ==-iygsIMXTVeSyYkUxAqpHmymrgwN5InkOfeRhhPIPa88FO9FRuZosIBTY18tflChACznk3qferT7iMGKm7pumDTR4FbVVlK/3n1ER0eMKu2NcaXb7m10xT6kLW1Xb3LtuZEnuis5pYuEwT1zR7GskeNWdYZ0dAJpNDLFrqPyAPo5s1KLDHKpw+VfVd4uf7RMjOIzuJhAAYAG+amyivQt61I9aYiwpHQvUphvTwi0X0qL/oDJHAQbIv4Qwscyo4aYZJBKutYioZH9rgOP6Yw/sCltpoPWlJtDOcw/iEWYiCVG1pH9AWjCYXZ9AbbEBOWV71IQr5VWrsqFZ7cg7hLEJ3A==-MIIEPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTEwMjA4MjE0OFoXDTE4MTEwMTA4MjE0OFowETEPMA0GA1UEAwwGcHJvZDN5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQC9WZuYgQedSuOc5TOUSrRigMw4/+wuC5EtZBfvdl4HT/8vzMW/oUlIP4YCvA0XKyBaCJ2iX+ZCDKoPfiYXiaSiH+HxAPV6J79vvouxKrWg2XV6ShFtPLP+0gPdGq3x9R3+kJbmAm8w+FOdlWqAfJrLvpzMGNeDU14YGXiZ9bVzmIQbwrBA+c/F4tlK/DV07dsNExihqFoibnqDiVNTGombaU2dDup2gwKdL81ua8EIcGNExHe82kjF4zwfadHk3bQVvbfdAwxcDy4xBjs3L4raPLU3yenSzr/OEur1+jfOxnQSmEcMXKXgrAQ9U55gwjcOFKrgOxEdek/Sk1VfOjvS+nuM4eyEruFMfaZHzoQiuw4IqgGc45ohFH0UUyjYcuFxxDSU9lMCv8qdHKm+wnPRb0l9l5vXsCBDuhAGYD6ss+Ga+aDY6f/qXZuUCEUOH3QUNbbCUlviSz6+GiRnt1kA9N2Qachl+2yBfaqUqr8h7Z2gsx5LcIf5kYNsqJ0GavXTVyWh7PYiKX4bs354ZQLUwwa/cG++2+wNWP+HtBhVxMRNTdVhSm38AknZlD+PTAsWGu9GyLmhti2EnVwGybSD2Dxmhxk3IPCkhKAK+pl0eWYGZWG3tJ9mZ7SowcXLWDFAk0lRJnKGFMTggrWjV8GYpw5bq23VmIqqDLgkNzuoog==  

 

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
<think> 我们面对的问题:使用PythonSelenium判断浏览器是否已被打开 根据引用[3]中的方法,我们可以通过尝试连接一个已经打开的浏览器调试端口来判断浏览器是否已被打开。具体来说,如果浏览器在启动时开启了调试端口(例如9222),那么我们可以通过Selenium的Options设置debuggerAddress来连接这个端口。如果连接成功,则说明浏览器已被打开;如果连接失败(抛出异常),则说明浏览器未打开。 步骤: 1. 首先,需要确保浏览器是以远程调试模式启动的(例如:Chrome浏览器通过命令行参数`--remote-debugging-port=9222`启动)。 2. 在Python中,我们使用selenium的webdriver,并设置Options的debuggerAddress为已知的地址和端口(例如127.0.0.1:9222)。 3. 尝试初始化webdriver,如果成功则说明浏览器已打开;如果失败(例如无法连接到调试端口),则说明浏览器未打开。 注意:此方法需要预先知道浏览器调试端口,并且浏览器启动时必须开启了调试模式。 代码示例: 首先,我们假设浏览器已经以调试模式打开,并且监听在9222端口。 然后,我们可以编写一个函数来尝试连接这个端口: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import WebDriverException def is_browser_opened(debugging_address="127.0.0.1:9222"): try: chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", debugging_address) # 注意:这里需要指定chromedriver的路径,或者确保它在系统PATH中 driver = webdriver.Chrome(options=chrome_options) # 如果连接成功,我们立即关闭driver(因为我们只是检查连接,并不需要实际使用) driver.quit() return True except WebDriverException: # 如果连接过程中出现异常(如无法连接到调试端口),则返回False return False ``` 然而,上面的代码在连接失败时会抛出异常,我们捕获异常并返回False。 但是,这里有几个注意事项: 1. 该方法仅适用于Chrome或基于Chromium的浏览器(如Edge)。 2. 需要指定正确的chromedriver路径,或者确保它在环境变量中。 3. 如果浏览器已经打开,但是调试端口不是指定的端口,或者没有以调试模式打开,那么也会返回False。 另一种思路:如果不需要控制已打开的浏览器,而只是想检查是否有浏览器进程在运行,可以使用操作系统层面的命令。例如,在Windows上可以检查是否有chrome.exe进程,在Linux上可以检查是否有chrome进程。但这种方法无法确保是我们通过Selenium启动的浏览器,而且可能检查到用户自己打开的浏览器。 因此,如果我们是通过Selenium启动的浏览器,并且以调试模式启动,那么使用上述方法是最直接的。 如果我们没有以调试模式启动浏览器,那么我们可以考虑在启动浏览器时记录其进程ID,然后通过检查该进程ID是否存在来判断。但这需要我们在启动时记录,并且跨平台实现比较复杂。 结合用户需求,我们主要关注的是通过Selenium判断,所以上述使用调试端口的方法是合适的。 但是,上面的代码示例中,我们创建了一个新的driver实例然后立即退出了,这可能会影响已经打开的浏览器会话(实际上,我们只是连接并立即断开,不会影响原有会话)。另外,如果已经有多个浏览器窗口在调试端口上,连接会指向其中一个(通常是第一个)。 改进:我们也可以不创建完整的driver,而是尝试与调试端口建立连接(比如用socket连接)来检查端口是否在监听。但是,即使端口在监听,也不一定是浏览器(可能是其他程序),所以最稳妥的还是通过Selenium去连接。不过,为了快速检查,我们可以先检查端口是否开放,然后再尝试连接。 但是,由于引用[3]中已经提供了通过Selenium连接的方法,我们按照该方法实现。 另外,引用[1]和[2]是关于Selenium用于Web自动化和爬虫的,但并没有直接关于判断浏览器是否打开的方法,所以我们主要依据引用[3]。 因此,我们给出以下解决方案: 步骤: 1. 确保浏览器以远程调试模式启动(例如,使用`--remote-debugging-port=9222`)。 2. 使用Python尝试连接这个调试端口,如果连接成功则返回True,否则返回False。 代码实现如下: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import WebDriverException def is_browser_already_opened(port=9222): """ 检查指定调试端口的浏览器是否已经打开 :param port: 浏览器调试端口,默认9222 :return: bool """ debugging_address = f"127.0.0.1:{port}" chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", debugging_address) try: # 尝试初始化WebDriver,这里使用Chrome,其他浏览器类似 # 注意:如果chromedriver不在PATH中,需要指定executable_path driver = webdriver.Chrome(options=chrome_options) driver.quit() # 立即关闭,避免占用资源 return True except WebDriverException as e: print(f"连接调试端口失败: {e}") return False ``` 调用示例: ```python if is_browser_already_opened(): print("浏览器已打开") else: print("浏览器未打开") ``` 注意:这个函数在连接成功后会关闭刚刚创建的driver实例,但不会关闭已经打开的浏览器。 但是,这里有一点需要注意:当我们调用`webdriver.Chrome(options=chrome_options)`时,如果连接成功,我们会创建一个新的浏览器选项卡(tab)?实际上,根据调试模式的工作方式,我们连接的是整个浏览器实例,所以driver会连接到已经打开的浏览器,但不会创建新的选项卡(除非你调用`driver.get`打开新页面,但这里没有)。然后我们立即调用`driver.quit()`,这会关闭整个浏览器驱动,但不会关闭浏览器本身(因为浏览器不是由这个driver启动的)。但是,根据Selenium的行为,当我们连接到一个已经存在的浏览器时,调用`driver.quit()`只会关闭当前驱动的会话,而不会关闭浏览器。所以这是安全的。 然而,我们也可以不调用`driver.quit()`,而是直接获取标题或其他信息来验证,然后不退出。但这样会留下一个未被关闭的driver进程。所以最好还是退出。 但是,需要注意的是,频繁调用这个函数可能会创建和销毁多个driver进程,对性能有一定影响。因此,我们也可以考虑用更轻量的方式(比如检查端口是否开放)来先判断端口是否在监听,然后再尝试创建driver。不过,为了确保的确是浏览器,我们可能需要创建driver。 另一种改进:我们不需要每次都创建driver并退出,我们可以尝试连接调试端口的HTTP服务(例如http://127.0.0.1:9222/json/version),如果返回了浏览器的版本信息,则说明浏览器已打开。这样更轻量。 例如,使用requests库: ```python import requests def is_browser_already_opened(port=9222): try: response = requests.get(f"http://127.0.0.1:{port}/json/version", timeout=2) if response.status_code == 200: return True return False except requests.exceptions.ConnectionError: return False ``` 这种方法不需要启动chromedriver,更加快速和轻量。但是,它依赖于浏览器调试端口的HTTP接口。而且,这个接口在Chrome和Chromium浏览器中是存在的。 因此,我们推荐使用这种HTTP请求的方式来检查,避免启动driver。 但是,我们的引用[3]中并没有提到这种方法,所以我们可以作为扩展提供两种方法。 由于用户要求参考引用,而引用[3]提供了通过Selenium连接的方法,所以我们可以先提供引用[3]的方法,然后再提供这种更轻量的方法。 最终,我们给出两种方法供选择: 方法一:通过Selenium连接(引用[3]的方法) 优点:确保可以连接并且控制浏览器 缺点:需要启动driver,相对较慢 方法二:通过HTTP接口检查 优点:快速轻量 缺点:需要额外依赖requests库(但可以避免,使用urllib),且只能检查调试端口的HTTP服务是否响应,不能保证浏览器完全可用(但通常足够了) 这里我们假设用户已经安装了requests库,如果没有,可以使用urllib。 使用urllib的版本: ```python from urllib.request import urlopen from urllib.error import URLError def is_browser_already_opened(port=9222): url = f"http://127.0.0.1:{port}/json/version" try: with urlopen(url, timeout=2) as response: return response.status == 200 except URLError: return False ``` 但是,注意:在Python3中,urlopen返回的response没有status属性,需要检查code。修改如下: ```python from urllib.request import urlopen from urllib.error import URLError def is_browser_already_opened(port=9222): url = f"http://127.0.0.1:{port}/json/version" try: with urlopen(url, timeout=2) as response: # 获取状态码 return response.getcode() == 200 except Exception: # 包括URLError和timeout return False ``` 但是,即使返回200,也不一定代表就是浏览器,但调试端口通常是浏览器独占,所以可以认为是浏览器。 总结:我们推荐使用HTTP请求的方法,因为它更快且不依赖chromedriver。 因此,最终答案: 使用Python判断浏览器(Chrome)是否已被打开的方法: 1. 确保浏览器以调试模式启动(例如:`chrome.exe --remote-debugging-port=9222`) 2. 使用HTTP请求检查调试端口是否开放并返回200状态码 代码: ```python import urllib.request from urllib.error import URLError def is_browser_already_opened(port=9222): """ 通过检查Chrome调试端口是否开放来判断浏览器是否已打开 :param port: 调试端口,默认9222 :return: bool """ url = f"http://127.0.0.1:{port}/json/version" try: with urllib.request.urlopen(url, timeout=0.5) as response: return response.getcode() == 200 except Exception: return False ``` 注意:超时时间可以设置短一些(比如0.5秒),这样如果端口未开放可以快速返回。 如果用户没有以调试模式启动浏览器,则无法使用此方法。 相关问题: 1. 如何以调试模式启动Chrome浏览器? 2. 在Windows/Linux/Mac上启动Chrome浏览器调试模式的方法有何不同? 3. 除了Chrome,其他浏览器(如Firefox)如何判断是否已打开? 4. 如何避免浏览器调试端口被其他程序占用? 5. 如何同时检查多个调试端口的浏览器实例? 最后,在回答中引用参考[3]。 但是,请注意,引用[3]中并没有直接使用HTTP请求的方法,而是使用了Selenium连接。所以我们也可以同时提供两种方法,并说明各自的适用场景。 因此,我们给出两种方法,并比较: 方法一(基于Selenium连接): 优点:连接成功后可以直接使用driver操作浏览器 缺点:需要启动和退出driver,有一定开销 方法二(基于HTTP接口): 优点:快速轻量,适合仅检查浏览器是否打开 缺点:无法直接获得driver对象,不能操作浏览器 用户可以根据需要选择。 代码示例: 方法一(基于Selenium,参考引用[3]): ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import WebDriverException def is_browser_already_opened_selenium(port=9222): debugging_address = f"127.0.0.1:{port}" chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", debugging_address) try: driver = webdriver.Chrome(options=chrome_options) driver.quit() return True except WebDriverException: return False ``` 方法二(基于HTTP请求): ```python import urllib.request from urllib.error import URLError def is_browser_already_opened_http(port=9222): url = f"http://127.0.0.1:{port}/json/version" try: with urllib.request.urlopen(url, timeout=0.5) as response: return response.getcode() == 200 except Exception: return False ``` 因此,我们回答如下: </think> ### Python结合Selenium判断浏览器是否已被打开的方法 在Python中结合Selenium判断浏览器是否已被打开,主要通过以下两种方法实现: --- #### 方法一:通过调试端口连接检测(推荐) 此方法利用浏览器调试端口,尝试连接已存在的浏览器实例: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import WebDriverException def is_browser_opened(port=9222): """检测指定调试端口的浏览器是否已打开""" try: # 配置调试选项 chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", f"127.0.0.1:{port}") # 尝试连接浏览器 driver = webdriver.Chrome(options=chrome_options) driver.close() # 立即关闭连接 return True except WebDriverException: return False ``` **使用说明**: 1. 启动浏览器时需添加调试参数: ```bash chrome.exe --remote-debugging-port=9222 ``` 2. 调用函数检测: ```python if is_browser_opened(9222): print("浏览器已开启") else: print("浏览器未开启") ``` **原理**:通过连接浏览器的调试端口(默认9222),若连接成功则认为浏览器已打开[^3]。 --- #### 方法二:通过进程名检测(跨平台) 此方法通过检测系统进程判断浏览器是否运行: ```python import psutil # 需要安装: pip install psutil def is_chrome_running(): """检测Chrome浏览器进程是否存在""" for proc in psutil.process_iter(['name']): if 'chrome' in proc.info['name'].lower(): return True return False ``` **使用说明**: ```python if is_chrome_running(): print("Chrome正在运行") else: print("Chrome未运行") ``` **注意事项**: 1. 此方法可能误报用户手动打开的浏览器 2. 支持跨平台(Windows/Linux/Mac) 3. 需区分浏览器进程名(如Firefox为`firefox`) --- ### 方法对比 | **方法** | **优点** | **缺点** | **适用场景** | |------------------|-----------------------------------|-----------------------------------|--------------------------| | 调试端口连接 | 精确识别Selenium控制的浏览器实例 | 需预先设置调试端口 | 自动化测试环境 | | 进程检测 | 无需预配置,简单直接 | 无法区分具体实例,可能误报 | 快速状态检查 | --- ### 注意事项 1. **调试端口冲突**:确保端口未被其他程序占用,可通过`netstat -ano`检查 2. **浏览器兼容**: - Chrome/Edge:支持`--remote-debugging-port`参数 - Firefox:需使用`--start-debugger-server`参数 3. **权限问题**:Linux/Mac系统可能需要`sudo`权限访问进程信息 > 推荐优先使用**调试端口检测法**,能精准识别Selenium控制的浏览器实例。若只需检测浏览器是否存在,可选用进程检测法[^1][^3]。 --- ### 📚 相关问题 1. 如何让Chrome浏览器启动时自动开启调试端口? 2. Selenium如何区分多个已打开的浏览器实例? 3. Firefox浏览器如何设置远程调试端口? 4. 如何在Docker容器中检测宿主机的浏览器状态? 5. 进程检测方法如何避免误判其他含"chrome"名称的进程?[^1][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值