Selenium 入门教程(Python)

1.安装

pip install selenium

2.准备驱动

当前支持诸如chrome,firefox,Edge,IE等主流浏览器,前提是要下载浏览器驱动(驱动下载地址上网自行百度),否则会报诸如以下此类的错误:

selenium.common.exceptions.WebDriverException: Message: 'IEDriverServer.exe' executable needs to be in PATH. Please download from http://selenium-release.storage.googleapis.com/index.html and read up at https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH. 
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

下载浏览器版本匹配的驱动后,放在python目录下的Scripts目录下即可。

谷歌驱动.png
火狐驱动.png

3.完成以上步骤后,下面便可以调用使用浏览器了

取个简单的例子:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


if __name__ == '__main__':
    driver = webdriver.Firefox()
    driver.set_window_position(x=50,y=60)
    driver.set_window_size(width=1366, height=700)
    driver.get("http://www.python.org")
    print driver.title
    driver.close()

简单介绍一下上面例子:

  • 首先实例化一个FireFox WebDriver对象。
  • 之后,driver.set_window_position方法来设置浏览器窗口的起始位置(就是浏览器左上角的坐标位置)
  • driver.set_window_size用来设置浏览器窗口的大小。
  • 重点的dirver.get()方法,用来导航到给定的url地址的网页。WebDriver 将会等待直到页面全部加载完成后才会把控制权返回给脚本。
  • 最终,浏览器窗口关闭。当然,你也可以调用driver.quit()方法来结束浏览器调用,两个方法的不同之处在于,close()方法是关闭当期的浏览器窗口,而quit()方法是退出整个浏览器。

4.页面交互

要与页面进行交互,首先我们需要定位到某个元素,下面重点结束一下元素的定位方法。举个简单的例子:

<input type="text" name="passwd" id="passwd-id" />
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")

以上三种方法都能定位到input元素。在webdriver中使用xpath方法时要格外小心。如果页面上有多个元素匹配到查询,只有第一个元素会被返回。如果没有匹配到任何东西,就会报NoSuchElementException的错误。

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //form[@class='search_index_box auto fix mt10']/input[3]

当然了,在webdriver中不仅仅是xpath方法找不到元素会报错,所有的方法在找不到给定元素的时候都会报错。比如:

driver.get("http://www.baidu.com")
driver.find_element_by_id('zhanglinpeng')
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="zhanglinpeng"]

在webdriver中,支持的找元素的方法有:

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector

接下来,我们逐个的对其进行介绍:
第一个,很简单,举个例子就可以很清楚的看明白了:

百度首页的一个元素.png

为了获取该元素,我们可以使用find_element_by_id方法。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


if __name__ == '__main__':
    driver = webdriver.Firefox()
    driver.set_window_position(x=50, y=60)
    driver.set_window_size(width=1366, height=700)
    driver.get("http://www.baidu.com")
    inputelement = driver.find_element_by_id('kw')
    print inputelement.get_attribute('maxlength')
    print driver.title
    inputelement.send_keys("selenium")
    driver.close()
输出结果.png

第二个,find_element_by_name

简书的搜索框.png
from selenium import webdriver
from selenium.webdriver.common.keys import Keys


if __name__ == '__main__':
    driver = webdriver.Firefox()
    driver.set_window_position(x=50,y=60)
    driver.set_window_size(width=1366, height=700)
    driver.get("http://www.jianshu.com/")
    inputelement = driver.find_element_by_name('q')
    # driver.find_element_by_xpath("//form[@class='search_index_box auto fix mt10']/input[3]").send_keys()
    inputelement.send_keys('selenium')
    driver.find_element_by_class_name('search-btn').click()
    driver.close()

第三个,find_element_by_xpath,

<html>
    <body>
        <form id="loginForm">
          <input name="username" type="text" />
          <input name="password" type="password" />
          <input name="continue" type="submit" value="Login" />
          <input name="continue" type="button" value="Clear" />
      </form>
    </body>
<html>
login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")

上面的这些都是比较中规中矩的使用xpath方法,其实在实际使用中,可以结合实际情况,更加灵活地 使用,比如:

Paste_Image.png

第四个,find_element_by_link_text
这个是在当你知道链接文本内容的时候可以使用。

<html>
      <body>
            <p>Are you sure you want to do this?</p>
            <a href="continue.html">Continue</a>
            <a href="cancel.html">Cancel</a>
      </body>
<html>
continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')

最后介绍一个find_element_by_tag_name
顾名思义就是使用标签名来找元素。

Paste_Image.png

5.一些API接口使用

  • 首先介绍一下WebDriver:
    driver = webdriver.Firefox()
    执行了该命令之后,实际上
Paste_Image.png

firefox文件中的WebDriver类.png

可以看出这个实例化的类实际上继承的是remote文件中的父类WebDriver,该类的具体介绍会在另一文档中具体介绍。
但是有一个属性函数需要着重介绍一下那就是:self._switch_to = SwitchTo(self)该类的两个方法经常使用到

swith_to_frame.png

swith_to_window.png

举例
driver.switch_to.window(driver.window_handles[-1])
参数driver.window_handles是一个列表,包含当前session所有需要处理的窗口。
还有需要提到的是浏览器访问的当前和历史的转换

back_and_forward.png
  • 介绍一下ActionChains
actionchains的doc.png
click_and_hold.png
鼠标右击和双击.png

举例:

ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=loc+22 , yoffset=y - 445).perform()
释放鼠标.png
ActionChains(driver).release(on_element=element).perform()

6.异常介绍

定位元素定位不到的时候,会报NoSuchElementException的错误
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_bg gt_show']/div").is_displayed())
等待元素出现的时候,超时会报TimeoutException的错误
某元素在定位事,如果是临时出现,未定位到会报StaleElementReferenceException的错误。

StaleElementReferenceException.png

解决此类问题的一个方案为:

 serialnum = change_content_scriper(driver, count)
            # print '000',serialnum
            attempt = 0
            while attempt < 2:
                try:
                    while 'disabled' not in driver.find_element_by_id('altInfo_next').get_attribute('class'):
                        driver.find_element_by_id('altInfo_next').click()
                        WebDriverWait(driver, 30).until(lambda the_driver: int(the_driver.find_element_by_id('altInfo').find_element_by_xpath(".//tbody/tr[1]/td[1]").text)>serialnum)
                        serialnum = change_content_scriper(driver, count)
                        # print '111',serialnum
                    break
                except StaleElementReferenceException as e:
                    pass
                attempt += 1

PS:如果内容对你有帮助,留下个赞呗!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容