selenium自动化从0开始学习

发布于:2022-12-30 ⋅ 阅读:(470) ⋅ 点赞:(0)

day1

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

#导入浏览器
driver=webdriver.Chrome()
#打开网站
driver.get("https://cn.bing.com/")

#输入关键字
driver.find_element(By.ID,"sb_form_q").send_keys("51testing")
time.sleep(2)
#点击搜索按钮
driver.find_element(By.ID,"search_icon").click()

day2

定位元素的8种方法

id,name,class_name,link_text(partial_link_text--部分文本)(只有a标签才适合用),xpath,css_selector,tag_name

①id
②name
优点:易于定位元素,大多数属性值是唯一的
缺点:很多元素没有id和name属性
③class_name
④tag_name
优点:几乎所有的元素都有class_name和tag_name
缺点:class和tag的值往往不是唯一的,很难精准的找到一个元素
④link_text
⑤partial_link_text
特点:只能用于<a>标签
⑥xpath
⑧css_selector
xpath和css_selector几乎可以用于所有页面元素定位
用工具可以直接生成xpath和css_selector,但是不是100%管用

对应得操作
①click()
②send_keys()
③submit()
④clear()
select下拉框中的三个操作:
⑤select_by_index(第几个选项)
⑥select_by_value(value属性的值)
⑦select_by_visbile_text(页面上选项的文本值)
find_element_by_class_name()
①不支持同时用两个class_name定位
②可以用css_selector()代替class_name使用多个class_name来定位,在每个class_name钱加上小数点即可
#通过CSS_SELECTOR的方式可以采用任意属性来定位元素,只需要在属性的两边加中括号即可
driver.find_element(By.CSS_SELECTOR,'[value="1"]')

find_elements和find_element区别

find_elements:可以找到页面中所有符合条件的页面元素

find_element:找到的是页面中满足条件的第一个页面元素

find_element()==find_element()[0]

隐式等待(智能等待)

优点:只需要写一次,后面所有的代码都生效,智能的判断下一行代码等待多久才执行

缺点:页面未刷新或加载,隐式等待不起作用(处理弹框时不起作用)

显示等待

WebDriverWait(driver,30,0.5).until(expected_conditions.alert_is_present())

窗口切换

①找到新窗口的名字new_window = driver.window_handles[-1]

②切换到新窗口 driver.switch_to.window(new_window)

select(页面元素)

select_by_visble_text("选项的文本")

例如:

shen = driver.find_element(By.ID,'add-new-area-select')
Select(shen).select_by_visible_text('安徽省')
brand = driver.get(By.NAME,'brand_id')
Select(brand).select_by_value('3')
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("http://127.0.0.1:8088/pirate/index.php?m=user&c=public&a=login")
driver.maximize_window()
driver.implicitly_wait(5)
#登陆
driver.find_element(By.ID,"username").send_keys("djj")
driver.find_element(By.ID,"password").send_keys('123456')
driver.find_element(By.CLASS_NAME,'login_btn').click()


#点击进入购物商场
driver.find_element(By.LINK_TEXT,"进入商城购物").click() # 通过链接文本
# 优先级:id,name,class name,只有a标签才适合用link_text
# 搜索关键词
driver.find_element(By.NAME,"keyword").send_keys('电脑')
driver.find_element(By.CLASS_NAME,"btn1").click()
# 第5种方法:xpath
#点击商品
driver.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[3]/div/div[1]/a/img').click()

#切换窗口
new_window = driver.window_handles[-1] #找到新窗口的名称
driver.switch_to.window(new_window) #切换窗口

#加入购物车
driver.find_element(By.ID,'joinCarButton').click()

#去购物车结算
driver.find_element(By.CLASS_NAME,'shopCar_T_span3').click()

#第6种:css selector 最重要的一种,可以通过多个属性来定位
driver.find_element(By.CSS_SELECTOR,'.shopCar_btn_03.fl').click()

#添加新地址
driver.find_element(By.CLASS_NAME,"add-address").click()
driver.find_element(By.NAME,"address[address_name]").send_keys('djj')
driver.find_element(By.NAME,"address[mobile]").send_keys("14563232323")
#选择收获地区-省
shen = driver.find_element(By.ID,'add-new-area-select')
Select(shen).select_by_visible_text('安徽省')

#选择地区-市
shi = driver.find_elements(By.CLASS_NAME,"add-new-area-select")[1]
Select(shi).select_by_visible_text("芜湖市")
#选择地区-区
qu = driver.find_elements(By.TAG_NAME,"select")[2]
Select(qu).select_by_visible_text("无为县")

driver.find_element(By.NAME,"address[address]").send_keys("恒星大厦1001")
driver.find_element(By.NAME,"address[zipcode]").send_keys("1000000")

driver.find_element(By.CLASS_NAME,"aui_state_highlight").click()
submit方法 类似click,但是只能用于form表单
#当submit按钮无法定位时,可以通过submit方法提交表单中的任何一个元素,咋在form表单中所有的数据一起提交
#driver.find_element(By.CLASS_NAME,'login_btn').click()
driver.find_element(By.ID,"password").submit() #submit方法代替了登陆按钮并点击的操作

日历控件怎么填写?

①先删掉只读的属性

document.getElementById("date")

document.getElementById("date").removeAttribute("readonly")

②再输入文本

#删除日历中的只读属性
script ='document.getElementById("date").removeAttribute("readonly")'
driver.execute_script(script)
#清除固定值
driver.find_element(By.ID,'date').clear()
#弹出框的处理 alert
# 弹出框的处理alert不能右键坚持,不能用传统的方法操作
# selenium提供了三种alert的方法
# ①点击确定按钮
# driver.switch_to.alert.accept()
# ②点击取消按钮
# driver.switch_to.alert.dismiss()
# ③获取弹出框提示的文本信息
# driver.switch_to.alert.text
#处理弹框,直到弹框出现就不再等待,然后点击确定
WebDriverWait(driver,30,0.5).until(expected_conditions.alert_is_present())
driver.switch_to.alert.accept()

day3

一、验证码的处理方式

1.通过第三方网站识别验证码(准确率很高,但需要收费)

2.设置万能验证码

3.在测试环境屏蔽验证码

4.读取cookie和缓存

5.在输入验证码前,加一个固定时间等待,手动输入验证码(不适合自动化测试)

tip小知识:如何查看系统是否存在万能验证码?

controller层是否有strtolower(I('userverify'))!='1234'

二、属性明明存在但是定位不到?(元素存在但就是定位不到,说明该元素是属于一个子frame中)

1.检查网址中是否存在frame标签

①把鼠标放在根节点<body>的标签上,检查页面高亮部分是否覆盖全屏(未覆盖则说明存在frame标签)

②切换frame,可以通过frame的name属性进行切换

driver.switch_to.frame(“frame的name属性名”)

2.元素的高级操作(比如双击操作)

ActionChains中封装了所有可以对页面元素的高级操作

①ActionChains(driver):action是动作行为的意思;chains是链表的意思;driver代表当前浏览器;把当前浏览器转换成一个能够执行各种操作的行为链

ActionChains(driver).double_click(driver.find_element(By.ID,"4").click()).perform()

三、css selector 

1、copy的方法,先copy再选择css selector

2、手动自己书写的方法

①标签名可以直接在css selector中使用

<input value='1'>

②在css selector中,需要在class属性前加一个小数点

driver.find_element(By.CSS_SELECTOR,'.uploadBtn.state-finish.state-ready').click()

③在css中,需要在id属性前加一个#号

④大于号>表示父子关系,前面是后面的父元素(div >input 表示input元素有一个父节点div)

⑤空格表示祖先元素和子孙元素的关系(div#id input.class 表示页面中有一个id=‘id’的div元素,在该div元素的子孙节点中有一个input标签,该input标签有一个class=‘class’的属性)

⑥css可以用多个属性组合的方式定位一个元素

<input class='a b c d' value='1'>

driver.find_element(By.CSS_SELECTOR,".a .b .c .d[value='1']")

⑦各种符号的意义,能够改写复制出来的CSS_SELECTOR
#用来表示id

小数点用来表示class属性

[]用来表示所有属性[id='1'] or [class='a']

标签名前面没有任何符号(a or input[value=1"] )

四、图片如何上传

1、在前端点击的按钮不是真正负责上传的文件的控件,真正负责上传控件的是<input type='file'>

2、我们要做的就是找到这个控件,然后直接对这个控件进行sendkeys,发送图片的路径即可


网站公告

今日签到

点亮在社区的每一天
去签到