基于Selenium一键写CSDN博客并做成exe文件【python】

参考:原文1原文2

1、代码,原文python2,修改成了python 3,作者信息保留,请修改CSDN帐号登录信息:

# -*- coding: utf-8 -*-
# python 3.5.2
#Author:哈士奇说喵
#CSDN--实现一键写博客

from selenium import webdriver
import time

#shift-tab多行缩进(左)
print ('Please wait...Firefox loading...')
print ('---------------------------------')
#reload(sys)

PostUrl = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
driver=webdriver.Firefox()#用浏览器实现访问
#driver = webdriver.PhantomJS(executable_path="phantomjs.exe")#没用浏览器
driver.get(PostUrl)


#账号填充输入
elem_user = driver.find_element_by_id('username')
elem_psw = driver.find_element_by_id('password')

#可以自己修改登录名和账户密码,我自己的隐去了
elem_user.send_keys('41111111@qq.com')
elem_psw.send_keys('1111111')


#点击登录
#click_login = driver.find_element_by_xpath("//input[@class='logging']")
click_login = driver.find_element_by_xpath("//input[@class='logging']")
click_login.click()
print( 'log in...')
print ('---------------------------------')
time.sleep(1)

#先点击写博客图标,不然元素隐藏

click_wbic = driver.find_element_by_xpath("//ul[@class='btns']/li[5]")
click_wbic.click()
print ('jumping...')
print ('---------------------------------')


click_choice = driver.find_element_by_xpath("//div[@class='wrap clearfix']/dl/dt[4]/a")
click_choice.click()#将点击操作放在内部比较好
#定位新页面元素,将handle重定位即可
driver.switch_to_window(driver.window_handles[1])#定位弹出的第一个页面,也就是当前页面
click_markdown = driver.find_element_by_xpath("//p[@class='subtit']/a")
click_markdown.click()
print ('---------------------------------')
print ('here we go!')
#关闭无关页面,也可以根据自己喜好保留无关页面
driver.close()#关闭第二个页面,也就是一般编辑器下的CSDN
driver.switch_to_window(driver.window_handles[0])#关闭第1个页面,也就是登录主页
driver.close()

2、代码分析:
一些按键的定位是使用了xpath的编写方式,以“登录”为例,右键,检查,然后找到最近的一个class,因为这个登录直接在一个class 里,如下代码:

<input class="logging" accesskey="l" value="登 录" tabindex="6" type="button" data-form-sbm="1474112762583.3015">

所以根据xpath的路径规则,是 //input[@class=’logging’],然后,配合selenium的xpath选定语法,写为:

click_login = driver.find_element_by_xpath("//input[@class='logging']")

而写博客的按键,有所小复杂,因为检查的时候,不是直接在类里,需要向上寻找一个父类,注意不是平行的类,因此代码相对复杂点,形如:

click_wbic = driver.find_element_by_xpath("//ul[@class='btns']/li[5]")

click_choice = driver.find_element_by_xpath("//div[@class='wrap clearfix']/dl/dt[4]/a")

click_markdown = driver.find_element_by_xpath("//p[@class='subtit']/a")

3、xpath的路径分析是直接通过检查中的代码换成xpath模式,而不是右键 copy–> copy xpath模式。

4、做成exe登录更简单些。

5、全文需要安装firefox,为了保证和selenium兼容,我的是46英文版。

6、又查阅了其他人的xpath分析方法,发现不一定要通过class来区分,如下:

<input type="text" name="passwd" id="passwd-id" />

这段html语言,可以用以下的几种方法来定位。

element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_elements_by_tag_name("input")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")

而且你在用 xpath 的时候还需要注意的是,如果有多个元素匹配了 xpath,它只会返回第一个匹配的元素。如果没有找到,那么会抛出 NoSuchElementException 的异常。

7、由于firefox的加载比较慢,所以想通过PhantomJS来测试,但是发现他不识别既定的xpath路径,应该说是部分不识别,开头的还是识别的,中间的报错,坑爹啊。