selenium 笔记 webdriver 2

富文本 :先要切换到iframe中再定位

#coding:utf-8
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys

urlblog="http://www.cnblogs.com/"
driver=webdriver.Firefox()
driver.get(urlblog)

time.sleep(3)
driver.find_element_by_link_text(u"登录").click()

time.sleep(2)
#登录
driver.find_element_by_xpath("//input[@formcontrolname='username']").send_keys("caojuantest")
driver.find_element_by_xpath("//input[@formcontrolname='password']").send_keys("caojuantest123")
driver.find_element_by_xpath("//input[@formcontrolname='password']").submit()
time.sleep(10)
#我的博客
driver.find_element_by_link_text(u"我的博客").click()
#新博客
driver.find_element_by_id("blog_nav_newpost").click()
time.sleep(5)
#输入标题
driver.find_element_by_id("post-title").send_keys("testmyblog")
#输入多文本 前先 切换到iframe
driver.switch_to.frame("Editor_Edit_EditorBody_ifr")
driver.find_element_by_id("tinymce").send_keys(Keys.TAB) # 如果输入不上时用到
driver.find_element_by_id("tinymce").send_keys("hello ,I am here.")

文件上传 :send_keys

1 input 标签 type 属性值:file,可以用selenium提供的send_keys()方法

2 非input标签,可以借助autoit 工具或者SendKeys第三方库

#上传文件
fpath="D: estC1.png"
driver.switch_to.default_content
#driver.find_element_by_xpath("//table[@id='']/tbody/tr/td/a[@id='Editor_Edit_EditorBody_uploadImage']//img").click
driver.find_element_by_css_selector(img.mceIcon).click
time.sleep(3)
#切换到iframe上
iframe=driver.find_elements_by_tag_name('iframe')[1]
driver.switch_to.frame(iframe)
#文件
#driver.find_element_by_name("file").send_keys(fpath)
driver.find_element_by_xpath(".//input[@name='file']").send_keys(fpath)

获取元素属性

1 获取页面title:driver.title

2 显示在页面上的文本信息:使用.text获取

text=driver.find_element_by_id("setf").text

3 获取元素的标签 get_attribute("属性“)

name=driver.find_element_by_id("kw").get_attribute(”class")

4 获取输入框内的文本值

value=driver.find_element_by_id("kw").get_attribute("value")

5 获取浏览器名称:driver.name

爬页面源码:page_source


#coding:utf-8
from selenium import webdriver
import re
driver=webdriver.Firefox()
driver.get("https://www.cnblogs.com/caojuantest/")
page=driver.page_source
print(page)

re 正则匹配:非贪婪模式

findall方法返回的是一个list集合


#coding:utf-8
from selenium import webdriver
import re
driver=webdriver.Firefox()
driver.get("https://www.cnblogs.com/caojuantest/")
page=driver.page_source
#print(page)
#匹配?
url_list=re.findall('href="(.*?)"',page,re.S)
url_all=[]
for url in url_list:
if "http" in url:
print(url)
url_all.append(url)
print(url_all)

cookie

1 获取cookies:get_cookies()

#coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
print(driver.get_cookies())

driver.get("http://www.cnblogs.com/caojuantest")
print(driver.get_cookies())

2 获取指定name的cookie:driver.get_cookie(name)

3 清除指定 cookie:delete_cookie(name)

4 清除所有cookies:delete_all_cookies()

5 添加cookie的值:add_cookie(cookie_dict)

可以用添加cookie值,绕过验证码。使用fiddler抓包工具 取cookie值

登录时要勾选下次自动登录按钮

只有记住登录状态的网站才适合

JS处理滚动条

当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的。需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上。selenium没有直接的方法去控制流动条。

execute_script() 可以直接执行js的脚本

1 滚动条回到顶部:

js="var q=document.documentElement.scrollTop=0"

driver.execute_script(js)

2 滚动条拉到底部

js="var q=document.documentElement.scrollTop=10000"

driver.execute_script(js)

可以修改scrollTop的值,来定位右侧滚动条的位置,0是最上面

3 横向、纵向滚动条 scrollTo(x,y) x:横向距离;y:纵向距离

js="window.scrollTo(100,400);"

driver.execute_script(js)

#coding:utf-8
from selenium import webdriver
import time

driver=webdriver.Firefox()
driver.get("https://www.cnblogs.com/")
jsdown="var q=document.documentElement.scrollTop=10000;"
driver.execute_script(jsdown)
time.sleep(3)
jstop="var qt=document.documentElement.scrollTop=0;"
driver.execute_script(jstop)
time.sleep(3)

Chrome浏览器中:js="var q=document.body.scrollTop=0" driver.execute_script(js)

4 元素聚焦:

target=driver.find_element_by_xx()

driver.execute_script("arguments[0].scrollIntoView();",target)

#tg=driver.find_element_by_id("site_stats")
tg=driver.find_element_by_link_text("编辑推荐")
driver.execute_script("arguments[0].scrollIntoView()",tg)

获取浏览器名称:driver.name

为了 解决不同浏览器操作方法不一样的问题,可以写个函数去做兼容

先用driver.name获取浏览器名称,然后用if语句做个判断

#回到顶部
def scroll_top(name):
if name=="chrome":
js="var q=doument.body.scrollTop=0;"
else:
js="var q=document.documentElement.scrollTop=0;"
return js
#拉到底部
def scroll_foot(name):
if name=="chrome":
js="var q=document.body.scrollTop=10000;"
else:
js="var q=document.documentElement.scrollTop=10000;"
return js

#coding:utf-8
from selenium import webdriver
import time
import testfunc

driver=webdriver.Firefox()
driver.get("https://www.cnblogs.com/")
name=driver.name
jsdown= testfunc.scroll_foot(name)
driver.execute_script(jsdown)
time.sleep(3)
jstop=testfunc.scroll_top(name)
driver.execute_script(jstop)
time.sleep(3)

#tg=driver.find_element_by_id("site_stats")
tg=driver.find_element_by_link_text("编辑推荐")
driver.execute_script("arguments[0].scrollIntoView()",tg)

scrollTo函数不存在兼容性问题

scrollHeight 获取对象的滚动高度。

scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。

scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。

scrollWidth 获取对象的滚动宽度。

#滚动到底部
js="window.scrollTo(0,document.body.scrollHeight);"
driver.execute_script(js)
#滚动到顶部
js="window.scrollTo(0,0);"
driver.execute_script(js)

js 处理日历控件

先用js 去掉readonly属性,然后直接输入日期文本内容

#去掉元素的readonly属性
js="document.getElementById('train_date').removeAttribute('readonly');"
driver.execute_script(js)

在输入日期前,先清空文本,不然无法输入成功

#清空文本后输入
driver.find_element_by_id("train_date").clear()
driver.find_element_by_id("train_date").send_keys("2020-07-09")

js处理内嵌滚动条

纵向滚动:定位,通过控制scrollTop的值来控制滚动

#coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///D:/test/PythonSelenuimTest/testdivscroll.html")
time.sleep(2)
#底部
js1="var q=document.getElementById('yoyoketang').scrollTop=10000;"
driver.execute_script(js1)

time.sleep(3)
#顶部
js2="var q1=document.getElementById('yoyoketang').scrollTop=0;"
driver.execute_script(js2)

横向滚动:定位,通过控制scrollLeft的值来控制滚动条

#横向右侧
time.sleep(2)
js3="var q2 =document.getElementById('divcontent').scrolLeft=10000;"
driver.execute_script(js3)

time.sleep(3)
js4="var q4=document.getElementById('divcontent').scrollLeft=0;"
driver.execute_script(js4)

js处理多窗口 去掉target="_blank"属性

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver=webdriver.Firefox()
driver.get("https://www.baidu.com/")
#修改元素的target属性
js="var q=document.getElementsByClassName('mnav')[0].target='';"
driver.execute_script(js)
driver.find_element_by_link_text('新闻').click()

click失效问题:

1 先点击 父窗口,再点击这个元素

2 使用js点击:js="var q=document.getElementsByClassName('')[0].click();"

查看webdriver api

pydoc是python自带的模块,主要用于从python模块中自动生成文档

1 启动server

  打开 cmd 命令行,输入:python -m pydoc -p 7777

  -p 参数:这个表示在本机上启动服务

  7777 参数:这个是服务端口号,随意设置

2 在浏览器查看文档

  在浏览器输入:http://localhost:7777/

  显示python自带的模块 打到 site-packages 点开:selenium/webdriver/firefox/webdriver

原文地址:https://www.cnblogs.com/caojuansh/p/13268348.html