Selenium详解附实战地址(二)

目录 

一、页面交互操作

1.1、下拉框

1.2、弹出框

1.3、滚动条      

1.4、鼠标操作

1.5、文件上传

二、高级API

2.1、等待

2.2、frame切换

2.3 、切换多窗口

2.4、窗口截图

2.5、验证码


一、页面交互操作

1.1、下拉框

需求:使用‘注册A黄色.html’页面,完成对城市的下拉框的操作:

1).选择‘广州’

2).暂停2秒,选择‘上海’

3).暂停2秒,选择‘北京

第一种:通过元素定位,点击

from selenium.webdriver.common.by import By
​
driver = webdriver.Chrome()
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA%E9%BB%84%E8%89%B2.html")
driver.find_element(By.CSS_SELECTOR,"select option[value='gz']").click()
sleep(2)
driver.find_element(By.CSS_SELECTOR,"select option[value='sh']").click()
sleep(2)
driver.find_element(By.CSS_SELECTOR,"select option[value='bj']").click()
sleep(2)
driver.quit()

第二种:使用Select下拉框

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA%E9%BB%84%E8%89%B2.html")
ment =driver.find_element(By.CSS_SELECTOR,"#selectA")
select = Select(ment)
sleep(2)
select.select_by_index(2)  #根据下标 下标是从0开始的
sleep(2)
select.select_by_value("sh") #根据选项value的属性值
sleep(2)
select.select_by_visible_text("A北京")  #根据选项文本
sleep(2)
driver.quit()

1.2、弹出框

类型:

  • 自定义弹出框(不用处理、正常操作)

    • 可以直接通过web浏览器开发者工具查看到具体的元素信息

    • 通过元素定位后直接处理掉

  • JS弹出框

    • 通过JS函数实现,通过web浏览器开发者工具无法查看到元素信息

    • 常见的JS弹出框形式:alert(警告框),confirm(确认框),prompt(提示框)

需求:打开注册A.html页面,完成以下操作

1).点击 alert 按钮

2).关闭警告框

3).输入用户名:admin

driver.find_element(By.CSS_SELECTOR,"#alerta").click()
#获取弹框对象
e1 = driver.switch_to.alert
print(e1.text)
#同意确定
e1.accept()
# e1.dismiss() 取消
driver.quit()

1.3、滚动条
      

 selenium没有提供操作滚动条的方法,如果打开的网页很长,需要使用JS操作滚动才能定位到后面的元素

步骤:

  • 定义JS字符串 js = "window.scrollTo(0,1000)"

  • 执行JS字符串 driver.excute_scripte(js)

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA%E9%BB%84%E8%89%B2.html")
driver.set_window_size(100,500)
sleep(2)
#js-->向下滑动到10000像素 js(0,10000) 第一个0为水平滚动条
# js_down = "window.scrollTo(0,10000)"
# # driver.execute_script(js_down)
#动态执行滑到底部 document.body.scrollHeight
js_down = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js_down)
sleep(2)
#js-->向上
js_up = "window.scrollTo(0,0)"
driver.execute_script(js_up)
sleep(2)
driver.quit()

1.4、鼠标操作

  • 鼠标常用操作 [ˈækʃn tʃeɪnz]

    • 点击、悬停、右击、双击、拖拽等

  • 鼠标操作实现步骤

案例

需求:打开注册页面A,模拟鼠标悬停在‘注册’按钮上

需求:打开注册页面A,在用户名文本框上点击鼠标右键

需求:打开注册A,输入用户名admin,暂停3秒钟后,双击鼠标左键 ,选中admin

from selenium import webdriver
from selenium.webdriver import ActionChains
from time import sleep

driver = webdriver.Chrome()
#打开url
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA%E7%B4%AB%E8%89%B2.html")
#创建鼠标实例
action = ActionChains(driver)
#模拟鼠标悬停在‘注册’按钮上
e1 = driver.find_element_by_css_selector("button[type='submitA']")
action.move_to_element(e1).perform()
sleep(3)
#在用户名文本框上点击鼠标右键
e2 = driver.find_element_by_css_selector("#userA")
action.context_click(e2).perform()
sleep(3)
#在用户名文本框输入admin
e2.send_keys("admin")
sleep(3)
#双击文本框选中admin
action.double_click(e2).perform()
sleep(3)

driver.quit()

鼠标拖拽

action.drag_and_drop(e1,e2).perform()

练习:打开drop.html,把红色拖拽到绿色元素上

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from time import sleep
​
driver = webdriver.Chrome()
#打开url
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/drop.html")
#获取ActionChains对象
action = ActionChains(driver)
e1 = driver.find_element(By.CSS_SELECTOR,'div[id = "div1"]')
e2 = driver.find_element(By.CSS_SELECTOR,'#div2')
#拖拽并执行
action.drag_and_drop(e1,e2).perform()
#关闭浏览器
sleep(2)
driver.quit()

1.5、文件上传

文件上传使用的是定位到点击上传的位置,然后使用send_keys(r"路径")

这里的路径中 \ (反斜杠)会被认为是转义符号,在路径字符串前添加r ,表示不转义的意思

使用到的是注册A黄色.html,先滚动滚条到最下方,然后点击文件上传

driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA%E9%BB%84%E8%89%B2.html")
driver.maximize_window()
js = "window.scrollTo(0,500)"
driver.execute_script(js)
driver.find_element(By.CSS_SELECTOR,"[type='file']").send_keys(r"C:\Users\wenqi\Postman\files\work.txt")
 

二、高级API

2.1、等待

什么是等待?

​ 代码执行过程中,第一次未找到元素,先不抛出异常,激活等待时间,在等待过程中如果找到元素就执行

等待类型:

  • 隐式等待

  • 显式等待

  • 强制等待---》time.sleep(秒)

隐式等待:

  • 定位元素时,如果能定位到元素则直接返回该元素

  • 如果不能定位到该元素,则间隔一段时间后再去定位元素

  • 如果在达到最大时长时还没有找到指定元素,则抛出元素不存在异常NoSuchElementException

  • 语法:driver.implicitly_wait(timeout)

  • 说明:是对全部元素生效

  • 提示:在项目中,如果未封装自动化框架,推荐使用

#全局生效,所有元素第一次未找到触发,等待10秒
driver.implicitly_wait(5)
#验证隐式等待,如果没有等待定位不到直接报错,但是设置了就会等待在查找
driver.find_element(By.CSS_SELECTOR,"#userAA")

显式等待:

说明:针对单个元素生效

特点:查找并返回元素

用法:

#显示等待--》返回查找到的元素
e1 = WebDriverWait(driver,10,0.5).until(lambda x:x.find_element(By.CSS_SELECTOR,"#userA"))
e1.send_keys("admin")

2.2、frame切换

1、frame标签作用?

  • 在页面加载另一个页面

2、为什么要处理iframe?

  • 默认焦点在启动页面,如果不处理iframe,无法操作iframe嵌入的页面元素

3、如何处理?

方法一:通过iframe中的id属性

  • 1、切换到iframe driver.switch_to_frame(e1)

  • 2、操作元素 driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")

  • 3、回到默认页面 driver.switch_to_default_content()

方法二:通过iframe标签

driver.switch_to_frame(driver.find_element(By.XPATH,"//iframe[1]"))

4、操作Register.html

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
​
driver = webdriver.Chrome()
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/Register.html")
driver.find_element(By.CSS_SELECTOR,"#user").send_keys("admin")
e1 = driver.find_element(By.CSS_SELECTOR,"#idframe1")
driver.switch_to_frame(e1)  #切换到注册A页面
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")
driver.switch_to_default_content() #切回住页面
e2 = driver.find_element(By.CSS_SELECTOR,"#idframe2")
driver.switch_to_frame(e2)  #q  切换到注册B页面
driver.find_element(By.CSS_SELECTOR,"#userB").send_keys("admin")
sleep(3)
driver.quit()
​

2.3 、切换多窗口

1、什么是多窗口?

2、为什么要处理多窗口?

selenium默认焦点在启动窗口,要操作其他窗口必须处理

3、多窗口切换方法?

  • 获取窗口句柄 driver.window_handles使用句柄切换窗口 driver.switch_to.window(handle)

  • 句柄:窗口的唯一标识符

案例

打开注册示例页面

点击注册A网页链接

填写注册A网页内容

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import  sleep
​
driver = webdriver.Chrome()
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA%E7%B4%AB%E8%89%B2.html")
driver.find_element(By.PARTIAL_LINK_TEXT,"注册A网页").click()
#获取所有窗口句柄
handles = driver.window_handles
#切换窗口
driver.switch_to_window(handles[1])
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")
sleep(3)
driver.quit()

切换多窗口工具封装

Register.html

from selenium import webdriver
from selenium.webdriver.common.by import By
​
def switch_handle(title):
    handles = driver.window_handles
    for handle in handles:
        driver.switch_to_window(handle)
        if driver.title == title:
           return "找到了"
​
titleA = "注册A"
titleB = "注册B"
driver = webdriver.Chrome()
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/Register.html")
driver.find_element(By.LINK_TEXT,"注册A网页").click()
driver.find_element(By.LINK_TEXT,"注册B网页").click()
switch_handle(titleA)
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")
switch_handle(titleB)
driver.find_element(By.CSS_SELECTOR,"#userB").send_keys("admin")

定位不到元素怎么办?

1、元素定位代码是否正确?是否匹配到唯一元素

2、是否有做元素等待,是否需要鼠标悬浮

3、元素是否在新窗口,元素是否在iframe标签中

2.4、窗口截图

为什么截图?

​ 出错后,方便查看错误原因

driver.get_screenshot_as_file(imgpath )

练习:打开‘注册A.html’页面,1)填写注册信息 2)截图保存

from selenium import webdriver
from selenium.webdriver.common.by import By
​
driver = webdriver.Chrome()
driver.get("file:///D:/source/%E9%BB%91%E9%A9%AC/%E9%85%8D%E5%A5%97%E8%B5%84%E6%96%99/09%E7%AC%AC%E4%B9%9D%E9%98%B6%E6%AE%B5-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/web%E7%AB%AF%E7%8E%AF%E5%A2%83/web%E8%AF%BE%E5%A0%82%E7%B4%A0%E6%9D%90/web/%E6%B3%A8%E5%86%8CA.html")
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")
driver.find_element(By.CSS_SELECTOR,"#passwordA").send_keys("123456")
driver.get_screenshot_as_file("a.png")
driver.quit()
扩展--图片命名添加时间戳
driver.get_screenshot_as_file("error_{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))

2.5、验证码

验证码处理?

1、去掉验证码

2、使用万能验证码

3、验证码识别技术

4、记录cookie

cookie概念:

  • cookie是由Web服务器生成的,并且保存在用户浏览器上,它可以包含用户相关信息

  • cookie数据格式:键值对组成(python中的字典)

  • cookie的产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie数据

  • cookie的使用:当浏览器再次请求该网站时,浏览器把请求的数据和cookie数据一同提交给服务器,服务器检查该cookie,以此来辨认用户

cookie操作:

l driver.get_cookie(name) --> 获取指定cookie

l driver.get_cookies() --> 获取本网站所有本地cookies

l driver.add_cookie(cookie_dict) --> 添加cookie

l cookie_dict:一个字典对象,必选的键包括:"name" and "value",cookie_dict = {'name' : 'BDUSS', 'value' : 'U04dE9TQW01'}

练习:

需求:使用cookie实现跳过登录

1). 手动登录百度,获取cookie

2). 使用获取到的cookie,达到登录目的,然后就可以执行登录之后的操作

BDUSS是登录百度后的唯一身份凭证(*.baidu.com),拿到BDUSS就等于拿到帐号的控制权, 通行贴吧、知道、百科、文库、空间、百度云等百度主要产品。

from selenium import webdriver
​
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
#添加cookie
cookie_dict = {'name' : 'BDUSS', 'value' : 'U04dE9TQW01WXhhYm9MMWh-WEJuQUpafktZb204QW5NZzY0LVpGWWdHWWoyWmRqRVFBQUFBJCQAAAAAAAAAAAEAAACMFcfKcXFhbmRrazkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNMcGMjTHBjM'}
driver.add_cookie(cookie_dict)
driver.refresh()
driver.quit()

测试资源样例下载:链接:https://pan.baidu.com/s/1mNurra61O_v8O1suMy3yyw 提取码:nz6c(其他实战用的这个)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Selenium是一个用于自动化浏览器操作的工具。它可以通过编写脚本来模拟用户在浏览器中的行为,例如点击、输入文本等操作。根据提供的代码示例和引用,我可以给出以下关于Selenium详解Selenium提供了四个主要的操作:导航、元素定位、元素操作和获取属性。导航操作可以使浏览器跳转到指定的URL,如示例中的driver.get("http://www.baidu.com")。元素定位操作可以通过不同的定位方式(如ID、链接文本)来找到页面中的元素,如示例中的driver.find_element(By.ID,"kw")和driver.find_element(By.LINK_TEXT,"新闻")。元素操作可以对定位到的元素进行点击、输入文本等操作,如示例中的dir.click()和dir.send_keys("测试")。获取属性操作可以获取元素的属性值,如示例中的dir.get_attribute("id")。 此外,Selenium还提供了切换操作,可以切换到新窗口、iframe等页面元素上进行操作。示例中的browser.switch_to.frame方法就是切换到iframe。 总结起来,Selenium通过编写脚本基于HTTP请求,发送各种不同指令给浏览器驱动服务,然后由驱动服务来操作对应的浏览器。它可以帮助开发人员自动化测试或进行网页爬取等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [selenium框架解析](https://blog.csdn.net/Van_CLB/article/details/129099521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [selenium用法详解](https://blog.csdn.net/gbz2000/article/details/104426437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值