python+selenium学习悬浮在多级下拉菜单的操作
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 键盘
from selenium.webdriver.support.select import Select # 鼠标选择
driver = webdriver.Chrome()
driver.get("https://liushilive.github.io/html_example/index1.html")
#一个不错的练习地址
eleUser = driver.find_element_by_id("uid")
elePwd = driver.find_element_by_id("pwd")
eleUser.clear()
eleUser.send_keys("11111")
elePwd.send_keys("22222")
eleUser.send_keys(Keys.BACK_SPACE * 2) # 退格2次
elePwd.send_keys(Keys.ARROW_LEFT) # 光标移动
Button_Login = driver.find_element_by_xpath("//input[@type='submit']")
Button_Login.click()
P_List = driver.find_element_by_id("s3Id")
P_List_select = Select(P_List)
P_List_select.select_by_index(4)
P_List_select.select_by_value("6")
P_List_select.deselect_all() # 取消所有选择
Button1 = driver.find_element_by_id("b1")
Button2 = driver.find_element_by_id("b2")
Button1.click() # 弹出警告窗口
driver.switch_to.alert.accept() # 点击接受
driver.switch_to.alert.dismiss() # 点击取消
Button2.click() # 弹出输入窗口
driver.switch_to.alert.send_keys("Hello World!") # 输入内容
driver.switch_to.alert.accept() # 点击接受
###双击 属于 行动链对象
DB = driver.find_element_by_id("dblclick")
Ac = webdriver.ActionChains(driver) ############# 行动链对象
Ac.double_click(DB) ############# 双击
Ac.perform() # 执行
webdriver.ActionChains(driver).double_click(DB).perform() ###同上,一句执行
############## 悬浮在多级下拉菜单 #### 移动鼠标 ##############################
FenLei_Link = driver.find_element_by_link_text("分 类")
webdriver.ActionChains(driver).move_to_element(FenLei_Link).perform()
BianChengYuYan_Link = driver.find_element_by_link_text("编程语言")
webdriver.ActionChains(driver).move_to_element(BianChengYuYan_Link).perform()
PHP_Link = driver.find_element_by_link_text("PHP")
webdriver.ActionChains(driver).move_to_element(PHP_Link).perform()
webdriver.ActionChains(driver).move_by_offset(0, 44).perform() # 按偏移量移动
###################### 拖动滑块 #######################
HuaKuai = driver.find_element_by_xpath("//*[@id='drag']/div[3]") # 滑块
webdriver.ActionChains(driver).drag_and_drop_by_offset(HuaKuai, 300, 0).perform()
####################滑块拖动 模拟人为 ####################
HuaKuai = driver.find_element_by_xpath("//*[@id='drag']/div[3]") # 滑块
webdriver.ActionChains(driver).click_and_hold(HuaKuai).perform()
for i in range(50):
webdriver.ActionChains(driver).move_by_offset(6, 0).perform()
webdriver.ActionChains(driver).release().perform()
time.sleep(3)
ResetButton = driver.find_element_by_id("re_drag")
ResetButton.click() # 3秒后点击 重置 按钮
##################################################
#### 拖拽方块,把 方块1 移动到 方块5 ###############
ele1 = driver.find_element_by_xpath("//div[@data-dad-id='1']")
ele5 = driver.find_element_by_xpath("//div[@data-dad-id='5']")
webdriver.ActionChains(driver).click_and_hold(ele1).perform() # 鼠标点击左键不放
webdriver.ActionChains(driver).move_to_element(ele5).perform() # 移动到方块5上
webdriver.ActionChains(driver).release().perform() # 释放鼠标左键
#方法2:使用drag_and_drop , 一行代码搞定
webdriver.ActionChains(driver).drag_and_drop(ele1,ele5).perform()
####### 多选框 #######
C1 = driver.find_element_by_id("c1")
C2 = driver.find_element_by_id("c2")
C3 = driver.find_element_by_id("c3")
C4 = driver.find_element_by_id("c4")
if C1.is_selected():
print("已选择")
else:
print("没选择")
if C1.is_selected() is False:
print("没选择")
C1.click() # 勾上
########### 单选框 ############
Man = driver.find_element_by_id("man")
Woman = driver.find_element_by_id("woman")
if Man.is_selected():
print("当前选择男")
Woman.click()
###### 文件上传框 ####### 选择本地文件 ##############
CheckFile = driver.find_element_by_id("upload")
CheckFile.send_keys("C:\\111.txt") # 本地文件路径,需要双斜杠 \\
# input标签是可以直接send_keys的,其它不能
#####################################################
MyFrame = driver.find_element_by_name("frame1")
driver.switch_to.frame(MyFrame)
FHSY = driver.find_element_by_link_text("返回首页")
FHSY.click()
driver.switch_to.parent_frame() #切换回父框架
driver.switch_to.default_content() #切换到主页面
driver.switch_to.frame(None) #切换到主页面,同 driver.switch_to.default_content()
多级别的ul层做的下拉菜单,因为有隐藏和显示的问题。如果要实现点击,可以参考下面的办法。常规的总是出错。一定要用self.driver.execute_script("$(arguments[0]).click()", mo_li)
去点击。常规的鼠标操作的 ActionChains 类点击会各种出错。让你排查很久都无法解决。
# 显示等待导入
import xlwings as xw
# 导入一个月份计算器
from dateutil.relativedelta import relativedelta
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
# 浏览器驱动导入
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
# 数据入理
import pandas as pd
from sqlalchemy import create_engine
import time
import re
import xlsxwriter # 调用xlswriter包,用来生成表
from datetime import datetime
from selenium.webdriver.support import expected_conditions as Expect
# 导入提供鼠标操作的 ActionChains 类
from selenium.webdriver import ActionChains
from bs4 import BeautifulSoup
import requests
from functools import reduce
def main():
# 实例化类
amingTB = AmingQuShi(Flag=1, cate=50012082, day=30)
# 调用类方法
amingTB.run()
from pprint import pprint
class AmingQuShi(object):
def __init__(self, Flag, cate, day):
self.chromedriver = r"F:\cmd\chromedrivers\mydemo\chromedriver.exe"
# 设置options属性
self.options = Options()
# 设置驱动器
self.driver = None
# 设置等待时间
self.wait = None
# 构建一个列表用于存放竞品的链接
self.jp_urls = []
# 初始化转置的pd
self.df = None
self.data_df = None
# 超链接构造参数
self.Flag = Flag
self.cate = cate
self.day = day
# 格式化df,准备导入EXCEL
self.reset_df = None
self.actionChain = None
self.count=1
# 将子类目和超链接放进字典
self.dist_li_url=None
# 绑定浏览器
def band_chrome(self):
# 绑定到浏览器
self.options.add_experimental_option(
"debuggerAddress", "127.0.0.1:8866")
# 绑定及初始化浏览器
self.options_chrome()
# 驱动器绑定到浏览器
self.driver = webdriver.Chrome(
executable_path=self.chromedriver, options=self.options)
# 注入代码反爬虫
self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
# 设置查找等待时间
self.wait = WebDriverWait(self.driver, 60, 0.5)
print('绑定驱动器完成......')
# 休息1秒
self.driver.implicitly_wait(1)
# 进入初始化页
# 设置浏览器属性及进行反爬设置
def options_chrome(self):
self.options.add_argument('disable-infobars')
self.options.add_argument('--no-sandbox')
self.options.add_argument('disable-popup-blocking')
self.options.add_argument('disable-extensions')
self.options.add_argument('no-default-browser-check')
self.options.add_argument('disable-extensions')
self.options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
#就是这一行告诉chrome去掉了webdriver痕迹
self.options.add_argument(
"disable-blink-features=AutomationControlled")
def show_trees(self):
if self.count == 1:
self.driver.get('https://sycm.taobao.com/mc/mq/overview?cateFlag=1&cateId=50012082&dateRange=2021-01-04%7C2021-01-04&dateType=day&device=0&parentCateId=0&sellerType=-1&spm=a21ag.11815228.LeftMenu.d590.53f850a52E68jS')
time.sleep(5)
self.actionChain = ActionChains(self.driver)
xpa = '//*[@id="content-container"]//div[@class="oui-pro-common-picker isready"]//span'
time.sleep(3)
self.click_element_with_offset(xpath=xpa, xAxis=1, yAxis=1)
print("已经运行了{}个子类目:".format(self.count))
def show_ul_lis(self):
time.sleep(3)
xpa_li = '//ul[@class="tree-menu common-menu tree-scroll-menu-level-2"]/*[contains(@class,"tree-item common-item")]'
pprint("开始点击进入LI列表")
time.sleep(2)
lis =self.wait.until(EC.presence_of_all_elements_located((By.XPATH, xpa_li)))
print('捕获一下lis')
pprint(lis)
time.sleep(2)
dist_li_url = {}
# 进入迭代获取超链接的字典
for li in lis:
self.count += 1
time.sleep(5)
print("打印一下子行业:", li.text)
# print("打印一下li的类型:", type(li))
# pprint(xpa_li)
# self.click_element_with_offset(xpath=xpa_li, xAxis=1, yAxis=1)
time.sleep(3)
# 第五步:点击立即沟通按钮
print('鼠标移动到li上面')
mo_li=li.find_element_by_xpath(".//*[contains(text(),{})]".format(li.text))
self.driver.execute_script("$(arguments[0]).click()", mo_li)
self.show_trees()
# 获取当前页面的URL
currentPageUrl = self.driver.current_url
# 打印当前URL
print("获取网址",currentPageUrl)
print('将网址保存进字典中。。。。')
self.dist_li_url[li.text] = currentPageUrl
for i, j in self.dist_li_url.items():
print(i, j)
# 将字典保存进text中
s = str(self.dist_li_url)
f = open('dict.txt', 'w')
f.writelines(s)
f.close()
def run(self):
self.band_chrome()
self.show_trees()
self.show_ul_lis()