• 欢迎访问
  • ...

python+selenium 根据页面标题获取webdriver并进行操作

Python 程序员的旅途 3年前 (2022-06-09) 2290次浏览 已收录 0个评论

该方法只适用不同脚本执行未关闭的浏览器操作的需求,

使用固定端口,即启动chromedriver.exe时,指定端口号9515为访问端口(selenium不指定时默认随机端口号)以获取该页面的session,然后利用重写的start_session方法重新获取webdriver

以下代码只记录该操作:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author:


from selenium import webdriver
from selenium.webdriver import Remote
from selenium.webdriver.chrome import options
from selenium.common.exceptions import InvalidArgumentException
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import os
import sys
import time
import urllib.request
import json
import getpass

# 获取驱动路径,默认为脚本上两层目录
script_path = sys.argv[0]
# print(script_path)
dirver_path = os.path.dirname(os.path.dirname(os.path.dirname(script_path))) + "/chromedriver.exe"
# print(dirver_path)
driver_url = "http://127.0.0.1:9515"

driver = ""


# 网上找的重写start_session方法
class ReuseChrome_Class(Remote):
    def __init__(self, command_executor, desired_capabilities, session_id=""):
        self.r_session_id = session_id
        Remote.__init__(self, command_executor=command_executor, desired_capabilities=desired_capabilities)

    def start_session(self, capabilities, browser_profile=None):
        """
        重写start_session方法
        """
        if not isinstance(capabilities, dict):
            raise InvalidArgumentException("Capabilities must be a dictionary")
        if browser_profile:
            if "moz:firefoxOptions" in capabilities:
                capabilities["moz:firefoxOptions"]["profile"] = browser_profile.encoded
            else:
                capabilities.update({'firefox_profile': browser_profile.encoded})
        self.capabilities = options.Options().to_capabilities()
        self.session_id = self.r_session_id
        self.w3c = False


# 根据标题获取驱动中的sessionid
def get_session_id(title):
    global driver_url
    session_id = ""
    d_respon = urllib.request.urlopen(driver_url + "/sessions")
    result = d_respon.read().decode('utf-8')
    session_arraay = json.loads(str(result))
    # print(sessionArraay)
    for array in session_arraay["value"]:
        try:
            respon = urllib.request.urlopen(driver_url + "/session/" + array["id"] + "/title", timeout=0.1)
        except:
            continue
        result = respon.read().decode('utf-8')
        rejson = json.loads(result)
        # print(result)
        if rejson["value"] == title:
            session_id = array["id"]
            break
            # print(rejson["status"])
            # print(array["id"])
    return session_id


def start_chrome(c_url, user, pwd):
    global driver
    chrome_options = webdriver.ChromeOptions()
    # 初始化Webdriver时禁用W3C
    chrome_options.add_experimental_option('w3c', False)
    # 关闭浏览器提示信息
    # chrome_options.add_argument('disable-infobars')
    # 加载自己的chrome浏览器配置
    chrome_options.add_argument("--start-maximized")
    chrome_options.add_argument(f'--user-data-dir=C:/Users/{getpass.getuser()}/AppData/Local/Google/Chrome/User Data')
    # capabilities = DesiredCapabilities.CHROME
    driver = webdriver.Chrome(executable_path=dirver_path, port=9515, chrome_options=chrome_options)
    time.sleep(1)
    driver.get(c_url)
    time.sleep(2)
    driver.find_element_by_id("username").send_keys(user)
    driver.find_element_by_id("password").send_keys(pwd)
    # time.sleep(10)
    driver.find_element_by_class_name("submit-button").click()
    # driver.find_element_by_xpath("//a[@class='submit-button']").click()


# 已经有驱动存在,通过窗口标题查找
def driver_init_by_title(otc_title, otc_url=""):
    global driver
    try:
        sessionid = get_session_id(otc_title)
        # print("session=" + sessionid)
        capabilities = DesiredCapabilities.CHROME
        if sessionid == "":
            driver = webdriver.Remote(command_executor=driver_url, desired_capabilities=capabilities)
            start_chrome(otc_url)
        else:
            driver = ReuseChrome_Class(command_executor=driver_url, desired_capabilities={}, session_id=sessionid)
            driver.session_id = sessionid
        driver.switch_to.parent_frame()
        driver.switch_to.parent_frame()
    except Exception as e:
        print("error:" + str(e.__traceback__.tb_lineno))
        print(e)
        exit()


if __name__ == '__main__':
    title = ""
    driver_init_by_title(title)

版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:https://www.seesapril.com/?p=300
喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址