selenium: ide -录制 webdriver -库 提供了网页的操作方法 pip3 install -U selenium 安装:ie-ieserberdriver chrome-chromedriver firefox-geckodriver 浏览器驱动:http://npm.taobao.org/mirrors/chromedriver/ 驱动版本与浏览器需要匹配,最好关闭浏览器更新功能 通信流程: 1.xxxdriver(浏览器驱动)启动,ip+端口监听 2.python selenium webdriver跟浏览器驱动建立链接,发送http请求 3.浏览器驱动收到指令,驱动浏览器做操作 4.浏览器驱动把结果返回给 python selenium webdriver 5.继续发下一个http请求 6.最后断开链接,关闭驱动,关闭浏览器 定位方式: 1.根据元素属性来查找元素: id name class_name 只支持一个class值 tag_name 2.只针对a元素: link_text partial_link_text 3.多个属性组合查找元素: xpath css_selector from selenium import webdriverimport time# 启动Chrome浏览器driver = webdriver.Chrome()# 打开百度首页driver.get("http://www.baidu.com")# 最大化窗口driver.maximize_window()# 设置成浏览器窗口大小,宽400,高600driver.set_window_size(400, 600)#沉睡5秒time.sleep(5)driver.get("http://www.taobao.com")# 退回到百度首页driver.back()# 前进到淘宝页面driver.forward()#刷新driver.refresh()#关闭当前窗口driver.close()#退出webdriver程序driver.quit() # elements匹配多个元素返回列表#iddriver.find_element_by_id('kw').send_keys('selenium')#class#只能匹配class属性中的一个值driver.find_element_by_class_name('s_ipt').send_keys('selenium12')#namedriver.find_element_by_name('wd').send_keys('selenium14')#tag# HTML是通过tag来定义功能的,比如input是输入,table是表格等.每个元素其实就是一个tag,很难通过tag去区分不同的元素仅了解就行。下面代码仅做参考,运行时必定报错# driver.find_element_by_tag_name('input').send_keys('selenium16')#link_text# 此种方法是专门用来定位文本链接的driver.find_element_by_link_text('新闻').click()#partial_link_text# 一个超链接的文本很长很长如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。driver.find_element_by_partial_link_text('消').click()#Xpathdriver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')绝对定位: 以/开头,父/子顺序, full xpath /html/body/div[3]/div[4]/div/div[1]/div/h2/a, html下面的body下面的第三个div...... //*[@id="guonei"]/div[1]/div/h2/a 相对定位:(定位不要有下标不要单斜杠,越灵活越好) 以//开头 1.标签名[@属性=值],如果不是唯一就继续往父亲爷爷找 //a[@href="/guonei"] //*[@*="/guonei"]:通配只要结果等于guonei 2.层级定位(使用最多)://一级元素//二级元素...... //div[@class="civilnews"]//a[@href="/guonei"] 3.文本定位://标签名[text()=值] //a[text()="公告"] 4.包含定位,可以包含属性和文本://标签名[contains(@属性/text(),值)] 属性://a[contains(@href,"/Notify/index/courseid/")] 文本://a[contains(text(),"公告")] 5.逻辑运算定位 来组合更多元素特征,and or //标签名[@属性=值 or @属性=值] //标签名[@属性=值 and @属性=值 and contains(@属性/text(),值) and text()=值] //a[text()="公告" and contains(@href,"/Notify/index/courseid/")] 6.轴定位:关系定位,一般应用场景是表格样式的数据列,需要用组合来定位元素 a.通过兄弟姐妹找到自己 b.通过后代元素找到祖先元素 轴运算: ancestor:所有的祖先包括父亲 parent:父亲借点 preceding:当前元素节点之前的所有节点(html页面的先后顺序) preceding-sibling:当前元素节点之前的所有兄弟节点 following:当前元素节点之前的所有节点(html页面的先后顺序) following-sibling:当前元素节点之后的所有兄弟节点 语法: 已知元素/轴名称::标签名称[@属性=值] 例如,根据写忆找到阿花 ://p[@title="写忆"]/parent::*/following-sibling::li//p[@class="name"] 先找写忆》再找写忆的父亲》再找他父亲的弟弟》根据他父亲的弟弟找到需要的元素,默认是第一个,如果不是第一个用下标再找 //p[@title="路飞"]/preceding-sibling::p[@class="stuno"] //p[@title="路飞"]/following-sibling::p[@class="stuno"] 7.下标、js #css# 这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,driver.find_element_by_css_selector('#kw').send_keys('selenium')等待: 1.页面跑不过代码 2.设备原因,性能 3.页面渲染 等待操作以:显性为主,sleep为辅1.sleep >强制等待2.智能等待:最多愿意等10秒,如果在10秒内出现就继续下一行代码,超时异常:TimeoutException,NosuchElementException 隐形等待:2种场景,a.每个会话中只调用一次适用全局,会话就是打开浏览器到quit关闭的整个过程, driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('http://www.baidu.com') b.元素存在可见,元素被找到 显性等待:在你需要的地方直接用显性等待,那个地方需要用在哪个地方 等待:等待上限 - 15秒,轮询周期 - 多少秒去确认一下条件是否成立,默认是0.5 条件:专门的条件模块,Expected_condition WebDriverWait(driver,15,0.5).until/not_until(条件) from selenium.webdriver.support.wait import WebDriverWait,类 from selenium.webdriver.support import expected_conditions as EC,模块 loc = ("xpth",'//p[@title="路飞"]/following-sibling::p[@class="stuno"]') WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc)) 三大切换之窗口切换:
窗口切换,简单来说就是在原来的页面窗口下打开了一个新的窗口,需要要新的窗口中,去进行下一步的操作。
因此 需要知道:
1)怎么知道需要切换到哪个窗口?
2)代码程序怎么知道哪个窗口是新的窗口?
步骤:
1)得到目前打开的所有窗口。
这里要引入句柄的概念,每个窗口都有一个句柄。
所有窗口显示集合是一个列表。其顺序是:先出现的,先追加到列表;新的窗口,在列表的最后。
即最先打开的窗口,在列表第一个;
# 获取所有的窗口句柄 wins = driver.window_handles print(wins)
2)切换到新窗口
# 切换到新的窗口 driver.switch_to.window(wins[-1]) print("切换之后的句柄:",driver.current_window_handle)
3)在新的窗口里,定位元素操作元素
示例:
这里以在百度中输入“”搜索selenium webdriver“”,并在搜索结果中找到官网(切换到官网窗口),执行下载文件操作。
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 1、打开访问百度 driver = webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") # 2、在百度首页输入框中输入selenium webdriver # 1)定位到百度首页输入框:根据ID定位 # 2)在输入框中输入:selenium webdriver # 3)点击百度一下:根据ID定位,后加点击操作_click() element = driver.find_element_by_id("kw") element.send_keys("selenium webdriver") driver.find_element_by_id("su").click() # 3、在搜索到的页面结果中找到 - SeleniumHQ Browser Automation loc =(By.XPATH, '//a[text()=" - SeleniumHQ Browser Automation"]') # 使用隐性等待10秒,构建使得loc元素是可见的 WebDriverWait(driver,20).until(EC.visibility_of_element_located(loc)) # 触发新的窗口出现:找到 - SeleniumHQ Browser Automation元素后,点击跳转到先窗口 driver.find_element_by_xpath('//a[text()=" - SeleniumHQ Browser Automation"]').click() # 强制等待1秒 time.sleep(1) # 4、获取所有的窗口句柄 wins = driver.window_handles print(wins) # 5、获取自己当前所在的窗口句柄 print(driver.current_window_handle) # 6、切换到新的窗口 driver.switch_to.window(wins[-1]) print("切换之后的句柄:",driver.current_window_handle) # 7、在新的窗口等待查找的元素,并对元素进行点击操作 loc2 = (By.XPATH,'//div[@class="download-button webdriver"]') WebDriverWait(driver,15).until(EC.visibility_of_element_located(loc2)) driver.find_element(*loc2).click() # 8、退出会话 time.sleep(5) driver.quit()
三大切换之iframe和Alert切换
一、web窗口之iframe窗口切换
首先,iframe是html里面的html页面。
若遇到要操作的元素,在iframed当中,则需要进行此操作。
操作步骤:
1)判断要操作的元素是否在iframe当前,可使用元素定位方法进行判断;
2)若1中判断元素存在。则需要再判断切换到哪个iframe中。
3)切换方法:
driver.switch_to.frame()
参数支持3种方式来确定切换到哪个一个iframe:
#1) iframe下标 从0开始 driver.switch_to.frame(3) #2) iframe元素的name属性 driver.switch_to.frame("login_frame_qq") #3) iframe这个webElment元素。 driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@name="login_frame_qq"]))
具体实现的流程:
1)打开访问的页面;
2)根据元素定位等操作,进入到有iframe的页面;
3)操作到有iframe的页面当中,且后面的操作,是在此iframe中找到元素并操作;
4)切换到iframe窗口,进入下一代html当中
driver.switch_to.frame("iframe窗口_名称")
5)在firame窗口中定位元素操作;
6) 回到默认的html页面当中 - 第一代
driver.switch_to.default_content()
7)回到上一级的iframe - 上一代
driver.switch_to.parent_frame()
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 1、打开访问腾讯课堂 driver = webdriver.Chrome() driver.maximize_window() driver.get("https://ke.qq.com/") # 2、根据xpath定位当前页面登录按钮,点击登录进入QQ登录窗口 loc = (By.XPATH,'//a[@id="js_login"]') WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc)) driver.find_element_by_xpath('//a[@id="js_login"]').click() # 3、强制等待1秒 time.sleep(1) # 4、在新的弹窗中找到QQ登录按钮,点击进入QQ登录账号密码输入框 loc2 = (By.XPATH,'//i[@class="icon-font i-qq"]') WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc2)) driver.find_element_by_xpath('//i[@class="icon-font i-qq"]').click() # 5、在QQ账号登录窗口 loc3 =(By.XPATH,'//iframe[@name="login_frame_qq"]') WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc3)) driver.find_element_by_xpath('//iframe[@name="login_frame_qq"]').click() # 6、切换到新的iframe的窗口 driver.switch_to.frame("login_frame_qq") # 7、在QQ登录窗口定位到QQ账号信息 loc4 =(By.XPATH,'//*[@id="img_out_1xxxx"]') WebDriverWait(driver,20).until(EC.visibility_of_element_located(loc4)) driver.find_element_by_xpath('//*[@id="img_out_1xxxx"]').click() # 9、退出会话 time.sleep(10) driver.quit()
来源:https://www.cnblogs.com/zcok168/p/12651187.html