selenium学习

起手式

1.pycharm在File->settings->Project interpreter->里面下载好selenium模块,试试import一下这个包,如果成功则说明下载成功。(一般都没问题

2.还需要下载一下对应你的chrome浏览器版本的驱动,可以查看一下note.txt确定适用的版本,网址如下。

http://chromedriver.storage.googleapis.com/index.html

下载完后随意解压在一个地方(路径最好不要有中文),在代码中说明驱动路径就可以了,不一定要在环境变量里添加(我自己添加的时候出了问题。。wtcl)

完成这些以后,可以尝试一下试试模拟一下baidu搜索python,如果成功则说明一切准备就绪,脚本如下(暂时不需要知道整个代码是甚么)

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
chrome_driver = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'  #chromedriver的文件位置
browser = webdriver.Chrome(executable_path = chrome_driver)
try:
    browser.get("https://www.baidu.com")
    input=browser.find_element_by_id("kw")
    input.send_keys("Python")
    input.send_keys(Keys.ENTER)
    wait=WebDriverWait(browser,10)
    wait.until(EC.presence_of_element_located((By.ID,"content_left")))
    print(browser.current_url)
    print(browser.get_cookies())
    print(browser.page_source)
    time.sleep(10)
finally:
    browser.close()

元素定位(八种)

爬虫肯定离不开对页面元素的定位,包括输入、发送请求、抓取文本等等,参考链接:https://blog.csdn.net/qq_30990097/article/details/81386750

1.通过id或name定位

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

这里是一个网页前端代码,可以通过name或者id属性进行定位,id属性肯定是唯一的,name的话也是get的一个参数,可能会有其他地方也使用这个

browser = webdriver.Chrome(executable_path = chrome_driver)
brower.find_element_by_id("kw")
brower.find_element_by_name("wd")

2.通过class name或tag name定位

    <div class="jstEditor">
    <textarea cols="60" rows="10" accesskey="e" class="wiki-edit" name="issue[description]" id="issue_description">
    </textarea>
    </div>

通过元素中带的class属性定位

brower.find_element_by_class_name("iki-edit")

通过元素中的tag标签定位,这种定位方式极不靠谱,不推荐采取此种方式。

brower.find_element_by_tag_name("div")

附加说明,如果class属性含有空格,那么取其中一个不重复的字段就可以了,例子:

<a title="新建版本" tabindex="200" class="icon-only icon-add" data-remote="true" data-method="get" href="/projects/bk_community/versions/new">新建版本</a>

其中class的属性值为“icon-only icon-add”,取其中“icon-only”、“ icon-add”都可以,但最好是取其中唯一的。

brower.find_element_by_class_name("icon-add")

3.通过link text和partial link text定位

<a href="http://news.baidu.com" target="_blank" class="mnav">新闻</a>

通过text link定位元素

brower.find_element_by_link_text("新闻")

通过partial link text定位元素,当文字链接很长时,可以通过此方式取其中一部分,只要取的部分可以作为唯一标识。

brower.find_element_by_partial_link_text("新")

4.xpath定位

此种定位方式需知晓xpath路径,通过火狐浏览器就可以知道,具体如何操作,可以通过火狐或者chrome的插件安装一个xpath finder,来查看元素的xpath

有时候你还可以f12,把dom树单独分屏,然后点击左上那个鼠标样子的东西,可以自行定位,就有时候它就给你个id,但是这个id是不固定的,那你只能通过它的上下层来判断。

调用的方法为:

brower.find_element_by_xpath("/html/body/div[1]/div/div[2]/ul/li[2]")

也可以通过相对路径自行填写,例如:

//*[@id="su"]/form/span/input              #通过上三级目录的id属性定位

当然也可以通过某一级的name属性定位。
对于不熟悉xpath的,可以看看w3school或者菜鸟教程

还有一个老师傅的博客可以参考参考,算是速成

5.CSS定位

这个。。说实话我感觉用处不大,暂时略,如果后面觉得它很好用我就重新补充。

我错了,我是sb。

css定位还是很牛的,这得好好记录一下

temp_input = browser.find_element_by_css_selector("input[data-caption='当天晨检体温']")

这里为什么我觉得css强呢。。是因为它不仅匹配了input这个

它还能根据里面的属性判断是哪个input,我感觉这个属性是人为定义的,所以只要找到它独一无二的属性就可以很轻松的定位了。

各种模拟操作

1.点击操作

根据元素定位获得元素后,可以对元素进行点击(各种)。

newday = browser.find_element_by_xpath('/html/body/main/article/section/div[2]/div[1]')
newday.click()                          #左键单击
newday.context_click()                  #右键点击
newday.double_click(on_element=None)	#双击
click_and_hold(on_element=None)	        #点击并抓起
drag_and_drop(source, target)	        
#在source元素上点击抓起,移动到target元素上松开放下。
drag_and_drop_by_offset(source, xoffset, yoffset)	
#在source元素上点击抓起,移动到相对于source元素偏移xoffset和yoffset的坐标位置放下

2.赋值

比如在框框(input)里填入内容

send_keys(*keys_to_send)	
将键发送到当前聚焦的元素。值是字符串就行
send_keys_to_element(element, *keys_to_send)	
将键发送到指定的元素。
clear()
清除元素的值

填入内容之后并没有发送请求,还需要对对应的元素进行点击

    user=browser.find_element_by_xpath("//*[@id='username']")
    user.clear()
    user.send_keys("123123")
    passwd=browser.find_element_by_xpath("//*[@id='password']")
    passwd.clear()
    passwd.send_keys("123123")
    log=browser.find_element_by_xpath("//*[@id='xsfw']")
    log.click()

3.等待

①显示等待

指定在某个时间内,如果某个条件满足了,那么就不会再等待,如果在指定的时间内条件都不满足,那么就不会再等待了。

要使用显示等待还需要载入一些selenium的包

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

其实完全使用import selenium是可以的,但是载入这么多包,运行起来就会比较慢,如果整个操作只需要几个模块,就无需载入完整的selenium。

下面是显示等待的用法:

WebDriverWait(browser, 30).until(EC.presence_of_element_located(
        (By.XPATH, "/html/body/div[1]/div[2]/div[1]/div/div[2]/div/a[2]")))

只要这个元素出现就停止等待,不然最多等待30秒,期间每0.5秒检查一下这个元素是否出现

这里的By.XPATH是指通过xpath来寻找元素并等待,同理还有classname什么的,pycharm会给补全

②隐式等待

这个等待比较弱,它只是让驱动在等待过程中,查看有没有元素,只要有元素它就不再等待

具体使用方法:

 browser.implicitly_wait(10)

其实这个比较鸡肋,一开始我以为这东西很好用,其实不然,还是要等确切的元素出现再点击,才不容易出错

4.切换窗口

有时候点击完了浏览器就会弹出一个新的窗口,这个时候需要你进行切换,因为你目前的操作句柄还在之前的页面,需要切换到最新的页面上去。

windows = browser.window_handles# 转换到最新打开的窗口
browser.switch_to.window(windows[-1])#即最新的窗口

如果要切换其他的窗口,也可以先打印所有句柄,然后

pageSource = browser.page_source
print(pageSource)

查看当前源代码

5.查看元素是否存在

因为我是个小萌新,代码水平有限,有时候要检查某个元素是否存在,进行测试,好像selenium没有这个函数,所以得自己写一个,具体如下:

def isElementExist_byxpath(driver, element):
    flag = True
    try:
        driver.find_element_by_xpath(element)
        return flag

    except:
        flag = False
        return flag

这里的xpath是根据你使用的查找方法设定的,可以自行修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值