求助:将Selenium ChromeDriver代码转换为EdgeDriver的实现方案
将Selenium ChromeDriver代码转换为EdgeDriver版本
转换后的完整代码
import time import pandas as pd from selenium import webdriver from bs4 import BeautifulSoup from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 替换Chrome相关服务导入为Edge版本 from selenium.webdriver.edge.service import Service from webdriver_manager.microsoft import EdgeChromiumDriverManager '''locators''' bank_cost_lt=(By.XPATH,"//*[@id='itembox-InstantBankDiscount']//a") x_mark_lt=(By.XPATH,"//*[@id='twister-plus-dp-bg']/i") partner_lt=(By.XPATH,"//*[@id='itembox-Partner']//a[@class='a-size-base a-link-emphasis vsx-offers-count']") # 替换ChromeOptions为EdgeOptions options = webdriver.EdgeOptions() prefs = {"profile.default_content_setting_values.notifications": 2} options.add_experimental_option("prefs", prefs) # 初始化Edge驱动,替换Chrome为Edge,使用EdgeChromiumDriverManager driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()), options=options) driver.implicitly_wait(0.5) # driver.maximize_window() df=pd.DataFrame(columns=['url','price','seller','bank offers','partner offers']) cnt=0 def presence_of_element_click(by_locator, timeout): WebDriverWait(driver, timeout).until(EC.presence_of_element_located(by_locator)).click() urls=["https://www.amazon.in/JBL-Cancellation-Headphones-Playtime-Assistant/dp/B096FYLJ6M/ref=sr_1_8?crid=OHZVHJG9Q7HN&keywords=jbl%2Bheadphones&qid=1672115942&s=electronics&sprefix=jbl%2Bheadphone%2Celectronics%2C235&sr=1-8&th=1"] # urls = ["https://www.amazon.in/dp/B0BGZN7FWV?th=1"] for url in urls: print(url) driver.get(url) time.sleep(3) WebDriverWait(driver, 180).until(lambda driver: driver.execute_script('return document.readyState') == 'complete') elem = driver.find_element('xpath','//*') source_code = elem.get_attribute("outerHTML") soup1 = BeautifulSoup(source_code, "html.parser") soup2 = BeautifulSoup(soup1.prettify(), "html.parser") price = soup2.find('span',{'class':'a-price aok-align-center reinventPricePriceToPayMargin priceToPay'}).span.text print(price) seller=soup2.find('div',{'id':'merchant-info'}).find('a').find('span').text print(seller) presence_of_element_click(bank_cost_lt,60) time.sleep(4) bank_=driver.find_element('id','InstantBankDiscount-sideSheet') source_code = bank_.get_attribute("outerHTML") soup1 = BeautifulSoup(source_code, "html.parser") soup2 = BeautifulSoup(soup1.prettify(), "html.parser") bank_offer_els=soup2.find_all('div',{'class':'a-section vsx-offers-desktop-lv__item'}) lst=[] for val in bank_offer_els: lst.append(str(val.p.text).strip()) presence_of_element_click(x_mark_lt,60) time.sleep(2) presence_of_element_click(partner_lt,60) time.sleep(2) bank_=driver.find_element('id','Partner-single-offer') source_code = bank_.get_attribute("outerHTML") soup1 = BeautifulSoup(source_code, "html.parser") soup2 = BeautifulSoup(soup1.prettify(), "html.parser") partner_els=soup2.find_all('div',{'class':'a-section vsx-offers-desktop-dv__content aok-block'}) par_lst=[] for val in partner_els: par_lst.append(str(val.text).strip()) presence_of_element_click(x_mark_lt,60) df.loc[cnt,'url']=url df.loc[cnt,'price']=price.strip() df.loc[cnt,'seller']= seller.strip() if lst: df.loc[cnt,'bank offers']=', '.join(lst) else: df.loc[cnt,'bank offers']='No offers' if par_lst: df.loc[cnt,'partner offers']=', '.join(par_lst) else: df.loc[cnt,'partner offers']='No Offers' cnt+=1 df.to_excel('output1.xlsx',index=False)
核心转换步骤
- 替换驱动相关的导入模块:
- 将
from selenium.webdriver.chrome.service import Service改为from selenium.webdriver.edge.service import Service - 将
from webdriver_manager.chrome import ChromeDriverManager改为from webdriver_manager.microsoft import EdgeChromiumDriverManager
- 将
- 替换浏览器配置类:把
webdriver.ChromeOptions()替换为webdriver.EdgeOptions(),两者的API几乎完全兼容,原有的偏好设置(如通知权限)无需修改 - 替换驱动初始化语句:将
webdriver.Chrome()改为webdriver.Edge(),同时传入Edge的Service实例,注意参数名从chrome_options改为标准的options(chrome_options是Chrome的专属旧参数,Edge使用通用的options参数)
内容的提问来源于stack exchange,提问作者Anirudh Sudarsan
相关产品推荐
相关产品推荐

