selenium初体验

selenium初体验

1、为什么要用到selenium?

由于项目中要对接第三方系统,没有开发的对接API,于是乎想起了用强大的selenium模拟登录,调试中遇到了常见的一些动作点击、下滑、选中、处理弹窗,切換窗口等

2、环境的准备(模块、浏览器驱动)

3、Linux环境快捷安装环境

  • 安装脚本,执行sh install.sh 即可

google-chrome_install_new.zip

image-20220628004043104

测试环境问题

运行selenium代码
新建一个test_demo.py文件,运行测试代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')  # 无界面
chrome_options.add_argument('--no-sandbox')  # 解决DevToolsActivePort文件不存在报错问题
chrome_options.add_argument('--disable-gpu')   # 禁用GPU硬件加速。如果软件渲染器没有就位,则GPU进程将不会启动。
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--window-size=1920,1080')  # 设置当前窗口的宽度和高度
driver = webdriver.Chrome('chromedriver',chrome_options=chrome_options)
#driver = webdriver.Chrome()
driver.get("https://www.cnblogs.com/")

print(driver.page_source)
driver.quit()

 

4、打开网页开始找规律,编写代码

ret

 

image-20220627004902551

 

image-20220627004949910

亚信 iframe 问题 正常的xpath路径去点击,查找不到路径的报错问题

image-20220627005139937

第二层ifram标签包裹 必须切换 否则会报错,找不到xpath路径问题,driver.switch_to.default_content()

代码实例:

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time


class Suite:
   def __init__(self, url, user, pwd):
       self.url = url
       self.user = user
       self.pwd = pwd
       # self.scan_ip = scan_ip
       self.driver = None

   def teardown_method(self):
       self.driver.quit()

   # 根据某个IP进行查杀
   def kill_virus(self):
       try:
           opt = webdriver.ChromeOptions()
           # 不弹窗
           opt.add_argument('--headless')
           opt.add_argument('--no-sandbox')
           opt.add_argument('--ignore-certificate-errors')
           opt.add_argument('--allow-insecure-localhost')
           # chrome_options.add_argument('--incognito') # 隐身模式(无痕模式)
           # chrome_options.add_argument('–disable-software-rasterizer')
           self.driver = webdriver.Chrome(chrome_options=opt)
           self.driver.get(self.url)
           # 登录
           self.driver.find_element_by_xpath('//*[@id="username"]').send_keys(self.user)
           self.driver.find_element_by_xpath('//*[@id="password"]').send_keys(self.pwd)

           self.driver.find_element_by_xpath('//*[@id="signinButton"]').click()
           self.driver.implicitly_wait(3)
           # 点击 管理
           self.driver.find_element_by_xpath('//*[@id="tab_administration"]/a').click()
           self.driver.implicitly_wait(5)
           # 截图方便调试
           # self.driver.get_screenshot_as_file("yaxin.png")
           # 点击 预设任务
           time.sleep(3)
           # 切换 iframe 元素;标签
           iframe = self.driver.find_element_by_xpath('//*[@id="menu"]')
           self.driver.switch_to_frame(iframe)
           # self.driver.get_screenshot_as_file("yaxin2.png")
           # self.driver.find_element_by_xpath('//*[@id="menu_scheduledTasks_text"]').click()
           stp1 = self.driver.find_element(By.XPATH, '//*[@id="menu_scheduledTasks_text"]/span')
           self.driver.execute_script("$(arguments[0]).click()", stp1)
           # 内嵌 得切换回iframe首页默认
           self.driver.switch_to.default_content()
           iframe = self.driver.find_element_by_xpath('//*[@id="content_iframe"]')
           self.driver.switch_to_frame(iframe)
           # self.driver.implicitly_wait(3)
           # 点击 预设任务选项栏 每日一次扫描计算机上有无恶意软件 12点
           # //*[@id="mainTable_row_8"]/td[1]/div/div/img
           serach_res = (self.driver.find_element(By.XPATH, '//*[@id="mainTable_row_8"]/td[2]/div/div').text).strip()
           if serach_res == "":
               self.driver.quit()
               return False, "预设查杀任务不存在"
           else:
               self.driver.find_element_by_xpath('//*[@id="mainTable_row_8"]/td[2]/div/div').click()
               self.driver.implicitly_wait(1)
               # //*[@id="tbi_runToolbarItem_text"]
               # 点击 立即启动任务
               self.driver.find_element_by_xpath('//*[@id="tbi_runToolbarItem_text"]').click()
               self.driver.quit()
               return True, "预设查杀任务已启动"
       except Exception as e:
           self.driver.quit()
           return False, str(e)


# 杀毒 延迟杀毒 只执行不管结果 设置延迟杀毒
def antivirus(params, assets, context_info):
   # scan_ip = params["kill_ip"]
   tq_url = assets["url"]
   user = assets["user"]
   pwd = assets["pwd"]
   # 返回值
   json_ret = {"code": 200, "msg": "", "data": {"result": ""}}

   '''添加函数实现'''
   suite = Suite(tq_url, user, pwd)
   try:
       is_suc, ret = suite.kill_virus()
       if is_suc:
           json_ret['msg'] = "查杀任务启动成功"
           json_ret['data']['result'] = "Killing success"
           suite.teardown_method()
       else:
           json_ret['code'] = 500
           json_ret['msg'] = "查杀任务启动失败:{}".format(ret)
           json_ret['data']['result'] = ""
   except Exception as e:
       json_ret['code'] = 500
       json_ret['msg'] = "查杀任务启动失败:{}".format(str(e))
       suite.teardown_method()
   return json_ret


if __name__ == '__main__':
   params = {
       # "scan_ip": "172.28.137.248",
       "kill_ip": "172.28.137.248",
  }
   assets = {
       "url": "https://172.16.3.105:14119",
       "user": "masteradmin",
       "pwd": "Trend@123",
  }
   context_info = {
       ""
  }
   res = antivirus(params, assets, context_info)
   print(res)

实例2

#代码
# -*- coding: utf-8 -*-


import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# from selenium.webdriver.support import expected_conditions as EC

class Suite:
   def __init__(self, url, user, pwd, scan_ip):
       self.url = url
       self.user = user
       self.pwd = pwd
       self.scan_ip = scan_ip
       self.driver = None

   def teardown_method(self):
       self.driver.quit()

   def chain_step(self):
       # init env
       try:
           opt = webdriver.ChromeOptions()
           opt.add_argument('--headless')
           opt.add_argument('--no-sandbox')
           opt.add_argument('--ignore-certificate-errors')
           opt.add_argument('--allow-insecure-localhost')

           self.driver = webdriver.Chrome(chrome_options=opt)
           self.driver.get(self.url)
           self.driver.find_element(By.ID, "username").click()
           self.driver.find_element(By.ID, "username").send_keys(self.user)
           self.driver.find_element(By.ID, "userpass").send_keys(self.pwd)
           self.driver.find_element(By.ID, "login").click()
           # 点击终端管理 //*[@id="skylarLeft"]/div/div[2]/div/ul/li[2]/a
           self.driver.implicitly_wait(3)
           stp1 = self.driver.find_element(By.XPATH, "//*[@id='skylarLeft']/div/div[2]/div/ul/li[2]/a/span")
           self.driver.execute_script("$(arguments[0]).click()", stp1)
           self.driver.implicitly_wait(3)
           # 点击病毒查杀
           stp2 = self.driver.find_element(By.XPATH, "//*[@id='skylarLeft']/div/div[2]/div/ul/li[2]/ul/li[2]/a/span")
           self.driver.execute_script("$(arguments[0]).click()", stp2)

           self.driver.implicitly_wait(3)
           # 检索 IP
           # self.driver.find_element(By.ID, "search-input").send_keys(self.scan_ip)
           # self.driver.find_element(By.ID, "search-input").send_keys(Keys.ENTER)
           self.driver.find_element_by_xpath('//*[@id="search-input"]').send_keys(str(self.scan_ip).strip(), Keys.ENTER)
           self.driver.implicitly_wait(3)
           time.sleep(3)
           # 检索结果
           serach_res = (self.driver.find_element(By.XPATH, "/html/body/div[2]/div[2]/div[2]/div/div/div/div[3]/div[2]/table/tbody/tr/td").text).strip()
           # print("------------------------------------")
           # print(serach_res)
           if serach_res == "查询数据为空":
               self.driver.quit()
               return False, "IP不存在"
           else:  # //*[@id="selectAllPage"] 勾选所有IP
               stp4 = self.driver.find_element(By.XPATH, "//*[@id='selectAllPage']")
               actions = ActionChains(self.driver)
               actions.move_to_element(stp4).perform()
               self.driver.implicitly_wait(3)
               # self.driver.get_screenshot_as_file('ret.png')
               stp5 = self.driver.find_element(By.XPATH, "/html/body/div[2]/div[2]/div[2]/div/div/div/div[1]/a[1]")
               self.driver.execute_script("$(arguments[0]).click()", stp5)
               return True, ''
       except Exception as e:
           self.driver.quit()
           return False, str(e)

   # 根据某个IP进行查杀
   def kill_virus(self):
       try:
           opt = webdriver.ChromeOptions()
           # 不弹窗
           opt.add_argument('--headless')
           opt.add_argument('--no-sandbox')
           # opt.add_argument('--disable-gpu')
           # opt.add_argument('--start-maximized')#浏览器最大化
           opt.add_argument('--ignore-certificate-errors')
           opt.add_argument('--allow-insecure-localhost')
           # chrome_options.add_argument('--incognito') # 隐身模式(无痕模式)
           # chrome_options.add_argument('–disable-software-rasterizer')
           self.driver = webdriver.Chrome(chrome_options=opt)
           self.driver.set_window_size(1920, 1080)
           self.driver.get(self.url)
           self.driver.find_element(By.ID, "username").click()
           self.driver.find_element(By.ID, "username").send_keys(self.user)
           self.driver.find_element(By.ID, "userpass").send_keys(self.pwd)
           self.driver.find_element(By.ID, "login").click()
           # 点击终端管理
           self.driver.implicitly_wait(3)
           stp1 = self.driver.find_element(By.XPATH, "//*[@id='skylarLeft']/div/div[2]/div/ul/li[2]/a/span")
           self.driver.execute_script("$(arguments[0]).click()", stp1)
           self.driver.implicitly_wait(3)
           # 点击病毒查杀
           stp2 = self.driver.find_element(By.XPATH, "//*[@id='skylarLeft']/div/div[2]/div/ul/li[2]/ul/li[2]/a/span")
           self.driver.execute_script("$(arguments[0]).click()", stp2)
           self.driver.implicitly_wait(3)
           # 输入IP
           # self.driver.find_element(By.ID, "search-input").send_keys(self.scan_ip)
           # self.driver.find_element(By.ID, "search-input").send_keys(Keys.ENTER)
           self.driver.find_element_by_xpath('//*[@id="search-input"]').send_keys(str(self.scan_ip).strip(), Keys.ENTER)
           self.driver.implicitly_wait(3)
           time.sleep(3)
           # 检索结果
           serach_res = (self.driver.find_element(By.XPATH, "/html/body/div[2]/div[2]/div[2]/div/div/div/div[3]/div[2]/table/tbody/tr/td").text).strip()
           if serach_res == "查询数据为空":
               self.driver.quit()
               return False, "IP不存在"
           else:
               time.sleep(2)
               # //*[@id="selectAllPage"] 选择所有计算机
               stp4 = self.driver.find_element(By.XPATH, "//*[@id='selectAllPage']").click()
               # 移动鼠标 勾选
               # actions = ActionChains(self.driver)
               # actions.move_to_element(stp4).perform()
               # self.driver.get_screenshot_as_file('gouxuan.png')
               # 设置隐式等待
               self.driver.implicitly_wait(3)
               time.sleep(3)
               # self.driver.get_screenshot_as_file('gouxuan.png')
               # 全盘扫描
               # //*[@id="allScan"]
               # stp5 = self.driver.find_eilement(By.XPATH, '//*[@id="allScan"]')
               # self.driver.execute_script("$(arguments[0]).click()", stp5)
               self.driver.find_element_by_xpath('//*[@id="allScan"]').click()
               self.driver.get_screenshot_as_file('results.png')
               # 切换弹窗
               # self.driver.find_element_by_xpath('//*[@id="mainContent"]/aside/div[1]/div').click()
               # # 切换窗口 默认最后一个
               # self.driver.switch_to.window(self.driver.window_handles[-1])
               # 定位对话框
               # print("---弹窗----")
               time.sleep(2)
               # //*[@id="allScan"]
               # self.driver.get_screenshot_as_file('tan.png')
               # print("--点击确认--")
               self.driver.find_element_by_xpath('/html/body/div[7]/div/div[3]/button').click()
               # wait = WebDriverWait(self.driver, 10)
               # wait.until(EC.alert_is_present())
               # print(res)
               # self.driver.switch_to.alert.accept()#注意之前的两步
               # alter = self.driver.switch_to_alert()
               # WebDriverWait(self.driver, 3).until(EC.alert_is_present()) # 等待3秒后判断是否弹出窗口出现
               # alter = self.driver.switch_to.alert
               # print(alter.text)
               # print(self.driver.switch_to.alert)
               # self.driver.get_screenshot_as_file('123.png')
               # 点击对话框[确定]按钮以关闭对话框
               # alter.accept()
               # print("--点击确认--")
               # 确定之后有弹框提示
               # WebDriverWait(self.driver, 3).until(EC.alert_is_present()) # 等待3秒后判断是否弹出窗口出现
               # alter = self.driver.switch_to.alert
               return True, ''
       except Exception as e:
           self.driver.quit()
           return False, str(e)


def scan(params, assets, context_info):
   """扫描"""
   scan_ip = params["scan_ip"]
   tq_url = assets["url"]
   user = assets["user"]
   pwd = assets["pwd"]

   # 返回值
   json_ret = {"code": 200, "msg": "", "data": {"result": ""}}

   '''添加函数实现'''
   suite = Suite(tq_url, user, pwd, scan_ip)
   try:
       is_suc, ret = suite.chain_step()
       if is_suc:
           json_ret['msg'] = "扫描成功"
           json_ret['data']['result'] = "Success"
           suite.teardown_method()
       else:
           json_ret['code'] = 500
           json_ret['msg'] = "扫描失败:{}".format(ret)
           json_ret['data']['result'] = ""
   except Exception as e:
       json_ret['code'] = 500
       json_ret['msg'] = "扫描失败:{}".format(str(e))
       suite.teardown_method()
   return json_ret


# 杀毒 延迟杀毒 只执行不管结果 设置延迟杀毒
def antivirus(params, assets, context_info):
   scan_ip = params["kill_ip"]
   tq_url = assets["url"]
   user = assets["user"]
   pwd = assets["pwd"]
   # 返回值
   json_ret = {"code": 200, "msg": "", "data": {"result": ""}}

   '''添加函数实现'''
   suite = Suite(tq_url, user, pwd, scan_ip)
   try:
       is_suc, ret = suite.kill_virus()
       if is_suc:
           json_ret['msg'] = "查杀成功"
           json_ret['data']['result'] = "Killing success"
           suite.teardown_method()
       else:
           json_ret['code'] = 500
           json_ret['msg'] = "查杀失败:{}".format(ret)
           json_ret['data']['result'] = ""
   except Exception as e:
       json_ret['code'] = 500
       json_ret['msg'] = "查杀失败:{}".format(str(e))
       suite.teardown_method()
   return json_ret


if __name__ == '__main__':
   params = {
       # "scan_ip": "172.28.137.248",
       "kill_ip": "172.28.137.248",
  }
   assets = {
       "url": "http://172.16.2.211:18080",
       "user": "admin",
       "pwd": "Jxshn100%",
  }
   context_info = {
       ""
  }
   res = antivirus(params, assets, context_info)
   # res = scan(params, assets, context_info)
   print(res)


 

5、小知识点

滑动至顶部

driver.execute_script("var q=document.documentElement.scrollTop=0")

滑动至低部

方法一

逐步滑动(可以看到滑动效果)

for i in range(10):
   driver.execute_script(f'document.documentElement.scrollTop={(i+1)*1000}')

方法二

直接到底部(显示底部)

driver.execute_script("var q=document.documentElement.scrollTop=10000")

 

selenium-iframe操作

当使用xpath路径去寻找时,发现路是正确的,代码运行却是报错找不到标签,查看html结构,属于iframe嵌套结构,所以得先进行切换操作。

对iframe进行操作,需要用到一下种方法:

  • switch_to_iframe() 切换到iframe上

  • switch_to.frame() 切换到iframe上

  • switch_to.default_content() 切换回原主页面

2.切换

#定位到iframe
iframe=driver.find_element_by_id("x-URS-iframe")
#切换到iframe
driver.switch_to_frame(iframe)

切换之后,就可以对iframe上的元素进行操作。

#登录,自行填写账号密码
driver.find_element_by_css_selector("input[name='email']").send_keys("XXX")
driver.find_element_by_css_selector("input[name='password']").send_keys("XXX")
time.sleep(3)
driver.find_element_by_id("dologin").click()

如果不切换直接操作iframe上的元素,编译器会报错

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: input[name='email']

3.switch_to_iframe方法上的横线

当我们调用switch_to_iframe时,编译器会在方法上划一条线

img

说明,这个方法虽然能用,但是已经过时,不推荐用。查阅文档可以发现,有一种方法将其替换

img

4.返回主页面

我们切换到iframe上之后,就无法对iframe以外的元素进行操作,如果需要,我们需要退出iframe

#退出iframe
driver.switch_to.default_content()

 

Selenium之定位浏览器弹窗方法汇总

1、Selenium-针对alert弹窗无法获取,弹出no such alert的解决方法

在爬取网页的过程中,经常会遇到一些弹窗的情况,有alert、confirm、prompt等三种,区别如下:

  1. alert() 弹出个提示框 (确定) 警告消息框 alert 方法有一个参数,即希望对用户显示的文本字符串。该字符串不是 HTML 格式。该消息框提供了一个“确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说,用户必须先关闭该消息框然后才能继续进行操作。

    import time
    from selenium import webdriver

    # 获取浏览器对象
    driver = webdriver.Chrome()
    # 设置浏览器窗口大小
    driver.maximize_window()
    # 进入百度首页
    driver.get('https://www.baidu.com/')
    # 进入百度设置页面
    driver.find_element_by_xpath("//*[@id='s-usersetting-top']").click()
    # 打开"搜索设置"
    driver.find_element_by_xpath("//*[@id='s-user-setting-menu']/div/a[1]").click()
    time.sleep(1)
    # 点击保存设置
    driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()
    # 此时就会弹出alter类对话框,使用switch_to_alert()定位到弹窗
    alter = driver.switch_to_alert()
    print(alter)
    print(driver.switch_to.alert)
    # 打印对话框内容
    print(alter.text)
    # 点击对话框[确定]按钮以关闭对话框
    alter.accept()
    time.sleep(2)
    #关闭对话框后继续操作页面
    driver.find_element_by_id("kw").send_keys("A")

    """
    <selenium.webdriver.common.alert.Alert object at 0x000001EDE7BBA7F0>
    <selenium.webdriver.common.alert.Alert object at 0x000001EDE7BC8D68>
    已经记录下您的使用偏好
    """

     

  1. confirm() 弹出个确认框 (确定,取消) 确认消息框 使用确认消息框可向用户问一个“是-或-否”问题,并且用户可以选择单击“确定”按钮或者单击“取消”按钮。confirm 方法的返回值为 true 或 false。该消息框也是模式对话框:用户必须在响应该对话框(单击一个按钮)将其关闭后,才能进行下一步操作。

  1. prompt() 弹出个输入框(确定,取消)

提示消息框 提供了一个文本字段,用户可以在此字段输入一个答案来响应您的提示。该消息框有一个“确定”按钮和一个“取消”按钮。如果您提供了一个辅助字符串参数,则提示消息框将在文本字段显示该辅助字符串作为默认响应。否则,默认文本为 "<undefined>"。

这三种弹窗的共同点是,弹出之后你是获取不到任何网页内容的,也就是无法通过常规的driver.find_element_by_xpath这种形式来获取元素。F12是没有任何内容,也无法点选的。

selenium另外有一套方法来把driver转换到弹窗上:

driver.switch_to.alert.accept()

在实际网页中,往往弹窗会有一定延时,这时候你用这个语句就会报一个no such alert的错误,意味着获取不到弹窗,此时要用如下的办法解决:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException

wait = WebDriverWait(driver, 10)
wait.until(EC.alert_is_present())
driver.switch_to.alert.accept()#注意之前的两步
cookiedict = driver.get_cookies()

 

引用Webdriver类,里面的参数第一个是句柄,第二个则是超时等待时间,这里是10秒钟。

Webdriver这种方法叫做显示等待,用一个默认频率不停的刷新(默认是0.5s),检测当前页面元素是否存在,如果超过10秒则抛出TimeOut。

很显然,这种方法比一般的sleep效率要高。 wait.until(EC.alert_is_present())就是判断弹窗是否存在,如果存在,那么就不会抛出异常,继续走下一步也就是获取到弹窗点击确定。

切换窗口

driver.switch_to.window(driver.window_handles[-1])

selenium---屏幕截图

Linux环境无头隐藏式运行时的调试利器

driver.get_screenshot_as_file('123.png')
 

 

 

posted @ 2022-06-28 09:22  游走De提莫  阅读(48)  评论(0编辑  收藏  举报