用selenium操作一下网易云音乐!

发表于:2023-7-28 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:野先生    来源:知乎

  Selenium是一个Web自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器,也包括PhantomJS这些无界面的浏览器。
  Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
  Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用,所以需要浏览器驱动,以便selenium操作浏览器。
  安装webdriver:
  各大浏览器的webdriver地址如下:
  Firefox:https://github.com/mozilla/geckodriver/releases/
  Chrome:http://chromedriver.storage.googleapis.com/index.html
  IE:http://selenium-release.storage.googleapis.com/index.html
  注意:webdriver需要和对应的浏览器版本以及selenium版本对应
  下载webdriver后拷贝至:
  Win:复制webdriver到Python安装目录下
  Mac:复制webdriver到/usr/local/bin目录下
  也可以放在别出,实例对象时使用executable_path=‘’指定位置
  好了,准备工作差不多了,开始怼,遇到问题再解决。
  代码:
  from selenium import webdriver
  from selenium.webdriver.common.keys import Keys
  import time
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.ui import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  browser = webdriver.Chrome()
  browser.get('https://music.163.com')
  # browser.set_window_size(1024,768) # 设置窗口尺寸
  browser.maximize_window() # 全屏
  # 设置全局的隐式等待(直到找到元素),10秒后找不到抛出找不到元素
  browser.implicitly_wait(10)
  # 显式等待找到元素id=g_nav2, 0.5秒巡查一次,5秒超时
  echoobj = WebDriverWait(browser,5,0.5).until(EC.visibility_of_element_located((By.ID,'g_nav2')))
  time.sleep(1)
  # 截取当前屏幕
  browser.get_screenshot_as_file('./v.png')
  # 仅截echoobj对象的范围,定点元素截图
  echoobj.screenshot('./p.png')
  print('元素大小:',echoobj.size) # g_nav2元素大小
  print('元素是否显示:',echoobj.is_displayed()) # True 显示,False 隐藏
  print(browser.title)
  print(browser.current_url) # 当前URL
  print('窗口句柄:',browser.current_window_handle)
  # 点击按钮
  browser.find_element_by_css_selector('.link.s-fc3').click()
  # time.sleep(1)
  browser.find_element_by_css_selector('.u-btn2.other').click()
  # time.sleep(1)
  browser.find_element_by_id('j-official-terms').click()
  # time.sleep(1)
  browser.find_element_by_css_selector('.u-btn2.u-btn2-2').click()
  # time.sleep(1)
  # 登录手机号账户
  browser.find_element_by_id('p').send_keys('user name')
  browser.find_element_by_id('pw').send_keys('password')
  browser.find_element_by_css_selector('.j-primary.u-btn2.u-btn2-2').click()
  browser.refresh() # 刷新页面
  # 点击排行榜
  browser.find_element_by_css_selector('#g_nav2 > div > ul > li:nth-child(2) > a').click()
  # 切到id=g_iframe的iframe,以便播放歌曲
  browser.switch_to.frame('g_iframe') 
  time.sleep(1)
  browser.find_element_by_css_selector(".u-btn2.u-btn2-2.u-btni-addply.f-fl").click() # 播放
  time.sleep(10)
  # 切换到上一层,跳出当前iframe,因为当前只有一个主 html和一个嵌套iframe,挑出后回到主html
  browser.switch_to.parent_frame() 
  # browser.switch_to.default_content() # 切到主HTML
  # 搜索歌曲,播放
  bs = browser.find_element_by_id('srch')
  bs.send_keys('海底')
  # 键盘回车操作
  bs.send_keys(Keys.ENTER)
  browser.switch_to.frame('g_iframe')
  # browser.find_element_by_id('song_1426649237').click() # 功能同下
  browser.find_element_by_class_name('ply').click()
  time.sleep(10)
  browser.quit()
  打开网易云音乐,手机号登录,播放排行榜歌曲,再搜索歌曲播放,最后关闭网页,大概就这些操作流程,需要注释的在代码内都有。
  下面是常用的元素定位及操作:
  元素定位:
   #通过id方式定位
   browser.find_element_by_id("kw")
   #通过name方式定位
   browser.find_element_by_name("wd")
   #通过tag name方式定位
   browser.find_element_by_tag_name("input")
   #通过class name方式定位
   browser.find_element_by_class_name("s_ipt")
   #多个class name定位
   browser.find_element_by_css_selector(".class1.class2")
   #通过CSS方式定位
   browser.find_element_by_css_selector("#kw")
   #通过xpath方式定位
   browser.find_element_by_xpath("//input[@id='kw']")
  操作对象:
   click():点击对象
   send_keys(“input”):在对象上模拟按键输入
   clear():清除对象的内容
   submit():提交对象的内容
   text:用于获取元素的文本信息
   get_attribute("href"):获取标签的某值
  键盘操作:
   from selenium.webdriver.common.keys import Keys
   send_keys(Keys.TAB):tab
   send_keys(Keys.ENTER) :回车
   send_keys(Keys.CONTROL,'a') :全选,ctrl+a
  可以使用dir(Keys)查看支持哪些键盘操作,help(Kesys)查看使用方法。
  鼠标操作:
   from selenium.webdriver.common.action_chains import ActionChains
   ActionChains 常用方法:
   perform():执行所有ActionChains 中存储的行为;
   context_click():右击;
   double_click() :双击;
   drag_and_drop() :拖动;
   move_to_element() :鼠标悬停。
  同上也可以使用dir(),help()方法。
  截图方法:
   bobj.screenshot(' '):仅截bobj对象的范围,定点元素截图
   get_screenshot_as_file(' '):截图屏幕
   get_screenshot_as_base64(‘ ’):截图屏幕,base64格式
   get_screenshot_as_png(‘ ‘ ):截图屏幕,二进制格式
  浏览器的前进后退:
   forward():前进
   back():后退
  注意:如果出现找不到定位元素的错误,首先先检查该元素是否在iframe块内,如果在需要切入iframe内定位元素(switch_to.frame('iframe_id')),示例代码有使用。
  示例代码运行时会打开浏览器,但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。
  PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。这里不做详细说明,有兴趣的可以自行研究一下。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号