相关文章推荐
安静的苦瓜  ·  selenium获取元素文本值·  1 月前    · 
聪明伶俐的领带  ·  java7兼容 java6 ...·  6 月前    · 
强悍的海龟  ·  Java ...·  1 年前    · 

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()