2. 基础的脚本使用(主要是定位)
一、从selenium包中导入webdriver:
from selenium import webdriver
二、创建一个Firefox浏览器驱动实例:
driver = webdriver.Firefox()
三、访问应用程序:
driver.get('https://www.baidu.com') 获取本地应用程序(下列应用程序和py文件在一个目录下): filepath = 'file:///' + os.path.abspath('文件名') driver.get(filepath)
四、隐式等待
driver.implicitly_wait(30) # 等待30秒 """ 1. implicitly_wait():隐式等待; 2. 当使用了隐士等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常; 3. 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0; 4. 一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢; 5. 它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。 """
五、浏览器最大化
driver.maximize_window()
六、休眠
import time time.sleep(0.3) # 休眠0.3秒 """ time.sleep() 函数随意插,哪里太快插哪里,再也不用担心看不清脚本的运行过程了。 其实,这个函数的真正用途不是给我们看脚本的运行过程的,有时候网络原因,或页面加载慢。假设搜索框输入框输入了selenium ,搜索按钮还没加载出来,那么脚本就报错。在适当的位置加入time.sleep()有助于减少网络原因造成的脚本执行失败; """
七、 元素定位和操作
1. name
find_element_by_name('name'); <input name = 'name_value' \> search_field = driver.find_element_by_name('name_value') search_field.clear() # 如果文本框已经有值的话,则清空 search_field.send_keys('自动化') # 输入新的特定的值 search_field.submit() # 提交搜索请求
2. xpath
复数
find_elements_by_xpath('//tag[@class/name="class_value/name_value"]'); """ 找到一系列标签名为tag,其class='class_value'或name='name_value'的内容; """ <a href="#" target="_blank">first</a> <a href="#" target="_blank">second</a> products = driver.find_elements_by_xpath("//a[@target='_blank']") find_elements_by_xpath('//tag1[@class/name="class_value/name_value"]/tag2'); """ 获取路径是以标签tag2结尾的所有内容列表; """
单数
find_element_by_xpath('//tag[@id="id_value"]'); xpath:attributer (属性) driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium") #input标签下id =kw的元素 xpath:idRelative (id相关性)
driver.find_element_by_xpath("//div[@id='fm']/form/span/input").send_keys("selenium") #在/form/span/input 层级标签下有个div标签的id=fm的元素 driver.find_element_by_xpath("//tr[@id='check']/td[2]").click() # id为'check' 的tr ,定闪他里面的第2个td xpath:position (位置) driver.find_element_by_xpath("//input").send_keys("selenium") driver.find_element_by_xpath("//tr[7]/td[2]").click() #第7个tr 里面的第2个td xpath: href (水平参考) driver.find_element_by_xpath("//a[contains(text(),'网页')]").click() #在a标签下有个文本(text)包含(contains)'网页' 的元素 xpath:link driver.find_element_by_xpath("//a[@href='http://www.baidu.com/']").click() #有个叫a的标签,他有个链接href='http://www.baidu.com/ 的元素
通过属性定位元素:
find_element_by_xpath("//标签名[@属性='属性值']") id属性: find_element_by_xpath("//input[@id='kw']") class属性: find_element_by_xpath("//input[@class='s_ipt']") name属性: find_element_by_xpath("//input[@name='wd']") maxlength属性: find_element_by_xpath("//input[@maxlength='255']")
通过标签名定位元素:
指所有input标签元素 find_element_by_xpath("//input") 父子定位元素: 查找有父亲元素的标签名为span,它的所有标签名叫input的子元素 find_element_by_xpath("//span/input") driver.find_element_by_xpath("//div[@class='header_nav']/ul/li/p[contains(text(),'首页')]") """ <div class='header_nav'> <ul> <li> <p> 首页 </p> </li> </ul> </div> """
根据元素内容定位元素(非常实用):
find_element_by_xpath("//p[contains(text(),'京公网')]") """ <p id="jgwab"> <i class="c-icon-jgwablogo"></i> 京公网安备11000002000001号 </p> """
注:contains的另一种用法 //input[contains(@class,'s')] 说明class属性包含s的元素。
组合定位元素: //父元素标签名/标签名的属性值:指的是span下的input标签下class属性为s_ipt的元素 find_element_by_xpath("//span/input[@class='s_ipt']")
多个属性组合定位(挺常用的) 指的是input标签下id属性为kw且name属性为wd的元素 find_element_by_xpath("//input[@class='s_ipt' and @name='wd']")
指的是p标签下内容包含“京公网”且id属性为jgwab的元素 find_element_by_xpath("//p[contains(text(),'京公网') and @id='jgwab']")
3. css
id: <input id="kw" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off"> driver.find_element_by_css_selector('#kw').send_keys('大角虫')
name: <a href="http://news.baidu.com" name="tj_news">新 闻</a> driver.find_element_by_css_selector("a[name=\"tj_news\"]").click()
title: <a onclick="queryTab(this);" mon="col=502&pn=0" title="web" href="http://www.baidu.com/">网页</a> driver.find_element_by_css_selector("a[title=\"web\"]").click()
class: <a class="RecycleBin xz" href="javascript:void(0);"> driver.find_element_by_css_selector("a.RecycleBin").click()
八、 WebDriverWait(driver, 10)
from selenium.webdriver.support.ui import WebDriverWait WebDriverWait(driver,10).until( lambda the_driver: the_driver.find_element_by_xpath('//div[@class="sug-result"]').is_displayed() ) # 10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。driver就不解释了,前面操作webdriver.firefox()的句柄;
九、 isdisabled()判断元素是否出现
WebDriverWait(driver,10).until( lambda the_driver: the_driver.find_element_by_xpath('//div[@class="sug-result"]').is_displayed() ) # 该元素是否用户可以见;
十、 class ActionChains(driver)
webdriver.ActionChains(driver).move_to_element(menu).perform()
driver: 执行用户操作实例webdriver
生成用户的行为。所有的行动都存储在actionchains对象。通过perform()存储的行为。
十一、 move_to_element(menu)
webdriver.ActionChains(driver).move_to_element(menu).perform()
移动鼠标到一个元素中,menu上面已经定义了他所指向的哪一个元素
to_element:元件移动到;
十二、 perform()
webdriver.ActionChains(driver).move_to_element(menu).perform()
执行所有存储的行为;
十三、 获取弹窗alert
driver.switch_to.alert
十四、 获取窗口
还有switch_to.window()
十五、 截图
中文路径和文件名的解决办法:在路径之前要加上u
其他截图方法:
十六、 判断元素是否存在
is_displayed函数只能用于该元素存在去判断此元素是否出现,而不能判断某个元素是否存在,需要自定义判断元素是否存在;
十七、 获取元素属性
driver.find_element_by_id('kw').get_attribute('maxlength/class/value/id/width/type/name……')
十八、 不打开浏览器的测试
# 不打开浏览器的测试 option = webdriver.ChromeOptions() option.add_argument("headless") # headless:在Chrome在headless模式下运行; # disable-gpu:作用是针对现有bug的work around; # remote-debugging-port=9222:作用则是允许我们可以在另外一个浏览器中debug; # option.add_argument('--headless') # option.add_argument('--disable-gpu') # option.add_argument('--remote-debugging-port=9222') driver = webdriver.Chrome(chrome_options=option, executable_path='E:\program\Python37\Scripts\chromedriver-2.43.exe')
十九、 正则表达式:匹配