Python selenium 账号密码登录CSDN

from time import sleep
from selenium import webdriver

def login():
    url = 'https://passport.csdn.net/login'   
    driver.get(url)

    driver.find_element_by_link_text('账号密码登录').click()    
    driver.find_element_by_id("all").send_keys(usrname)
    driver.find_element_by_id("password-number").send_keys(password)
    driver.find_element_by_css_selector('button[data-type="account"').click() 

if __name__ == '__main__':    
    # 输入你自己的 手机号/邮箱/用户名(user) 密码(password)
    usrname = 'user'
    password = 'password'    
    driver = webdriver.Chrome()
    login()
    sleep(10)
    driver.quit()

知识点 打开一个页面

打开页面与页面交互。对于一个页面中的 HTML 元素,首先我们要找到他。WebDriver 提供了大量的方法帮助你去查找元素,例如:已知一个元素定义如下:

<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']")

你还可以通过链接的文本查找他,需要注意的是,这个文本必须完全匹地配。 当你使用XPATH时,你必须注意,如果匹配超过一个元素,只返回第一个元素。 如果上面也没找到,将会抛出 NoSuchElementException异常。

所以,当你拿到 element 元素时,你能做什么呢?首先,你可能会想在文本框中输入一些内容:

element.send_keys("some text")

你还可以通过”Keys”类来模拟输入方向键:

element.send_keys(" and some", Keys.ARROW_DOWN)

当你输入一些文本时,这些 输入框中原有的文本不会被自动清除掉,相反,你的输入会继续添加到已存在文本之后。 你可以很方便的使用 clear 方法去清除 input 或者 textarea 元素中的内容:

element.clear()

HTML 奶酪的订单列表

<ol id=cheese>
 <li id=cheddar>…
 <li id=brie>…
 <li id=rochefort>…
 <li id=camembert>…
</ol>

一、定位元素

在 WebDriver 中定位元素是在 WebDriver 实例对象上完成的。 findElement(By) 方法返回另一个基本对象类型 WebElement。

  • WebDriver 代表浏览器
  • WebElement 表示特定的 DOM 节点(控件,例如链接或输入栏等)

一旦你已经找到一个元素的引用,你可以通过对该对象实例使用相同的调用来缩小搜索范围:

cheese = driver.find_element(By.ID, "cheese")
cheddar = cheese.find_elements_by_id("cheddar") # 复数版本

1、元素选择策略

在 WebDriver 中有 8 种不同的内置元素定位策略:

定位器 Locator

描述

id

定位 id 属性与搜索值匹配的元素

class name

定位class属性与搜索值匹配的元素(不允许使用复合类名)

name

定位 name 属性与搜索值匹配的元素

link text

定位link text可视文本与搜索值完全匹配的锚元素

partial link text

定位link text可视文本部分与搜索值部分匹配的锚点元素。如果匹配多个元素,则只选择第一个元素。

tag name

定位标签名称与搜索值匹配的元素

xpath

定位与 XPath 表达式匹配的元素

css selector

定位 CSS 选择器匹配的元素

2、相对定位

在Selenium 4中带来了相对定位这个新功能。 它可以帮助你通过某些元素作为参考来定位其附近的元素。 现在可用的相对定位有:

  • above 元素上
  • below 元素下
  • toLeftOf 元素左
  • toRightOf 元素右
  • near 附近

findElement 方法现在支持 witTagName() 新方法其可返回 RelativeLocator 相对定位对象。

3、如何工作

Selenium 是通过使用 JavaScript 函数 getBoundingClientRect() 来查找相对元素的。这个函数能够返回对应元素的各种属性例如:右,左,下,上。

通过下面的例子我们来理解一下关于相对定位的使用

Python 02 Selenium 账号密码登录CSDN_python

above() 元素上

返回当前指定元素位置上方的WebElement对象

from selenium.webdriver.support.relative_locator import with_tag_name

passwordField = driver.find_element(By.ID, "password")
emailAddressField = driver.find_element(with_tag_name("input").above(passwordField))

below() 元素下
返回当前指定元素位置下方的WebElement对象

from selenium.webdriver.support.relative_locator import with_tag_name

emailAddressField = driver.find_element(By.ID, "email")
passwordField = driver.find_element(with_tag_name("input").below(emailAddressField))

toLeftOf() 元素左

返回当前指定元素位置左方的WebElement对象

from selenium.webdriver.support.relative_locator import with_tag_name

submitButton = driver.find_element(By.ID, "submit")
cancelButton = driver.find_element(with_tag_name("button").to_left_of(submitButton))

toRightOf() 元素右

返回当前指定元素位置右方的WebElement对象

from selenium.webdriver.support.relative_locator import with_tag_name

cancelButton = driver.find_element(By.ID, "cancel")
submitButton = driver.find_element(with_tag_name("button").to_right_of(cancelButton))

near() 附近

返回当前指定元素位置附近大约px5050像素的WebElement对象

from selenium.webdriver.support.relative_locator import with_tag_name

emailAddressLabel = driver.find_element(By.ID, "lbl-email")
emailAddressField = driver.find_element(with_tag_name("input").near(emailAddressLabel))

二、提取节点信息

text	获取文本信息
get_attribute()	获取属性
send_keys()	输入文字
clear()	清空文字
click()	点击按钮
execute_script()	执行JavaScript,可以实现下拉进度条等
switch_to.frame()	切换Frame
back()	后退
forward()	前进
get_cookies()	获取Cookies
add_cookie()	添加一个Cookie
delete_all_cookies()	删除所有的Cookies

此外还可以获取节点的 id、location、tag_name、size 等属性。

三、填写表格

我们已经知道如何在 input 或 textarea 元素中输入内容,但是其他元素怎么办? 你可以“切换”下拉框的状态,你可以使用setSelected方法去做一些事情,比如 选择下拉列表,处理SELECT元素其实没有那么麻烦:

element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
    print("Value is: %s" % option.get_attribute("value"))
    option.click()

上面这段代码将会寻找页面第一个 “SELECT” 元素, 并且循环他的每一个OPTION元素, 打印 value 的值,然后按顺序都选中一遍。

正如你看到的那样,这不是处理 SELECT 元素最好的方法。WebDriver 的支持类包括一个叫做 Select的类,他提供有用的方法处理这些内容:

from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)

WebDriver 也提供一些有用的方法来取消选择已经选择的元素:

select = Select(driver.find_element_by_id('id'))
select.deselect_all()

这将取消选择所以的 OPTION。

假设在一个案例中,我们需要列出所有已经选择的选项,Select 类提供了方便的方法来实现这一点:

select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected_options

获得所选项:

options = select.options

一旦你填写完整个表单,你应该想去提交它,有一个方法就是去找到一个“submit” 按钮然后点击它:

# Assume the button has the ID "submit" :)
driver.find_element_by_id("submit").click()

或者,WebDriver 对每一个元素都有一个叫做 “submit” 的方法,如果你在一个表单内的 元素上使用该方法,WebDriver会在 DOM 树上就近找到最近的表单,返回提交它。 如果调用的元素不再表单内,将会抛出NoSuchElementException异常:

element.submit()

四、拖放

您可以使用拖放,无论是移动一个元素,或放到另一个元素内:

element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")

from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

五、在不同的窗口和框架之间移动

WebDriver 支持在不同的窗口之间移动,只需要调用switch_to_window方法即可:

driver.switch_to_window("windowName")

所有的 driver 将会指向当前窗口,但是你怎么知道当前窗口的名字呢,查看打开他的 javascript 或者连接代码:

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

或者,你可以在”switch_to_window()”中使用”窗口句柄”来打开它, 知道了这些,你就可以迭代所有已经打开的窗口了:

for handle in driver.window_handles:
    driver.switch_to_window(handle)

你还可以在不同的 frame 中切换 (or into iframes):

driver.switch_to_frame("frameName")

通过“.”操作符你还可以获得子 frame,并通过下标指定任意 frame,就像这样:

driver.switch_to_frame("frameName.0.child")

如何获取名叫“frameName”的 frame 中名叫 “child”的子 frame 呢? 来自topframe的所有的 frame 都会被评估 (All frames are evaluated as if from top.)

一旦我们完成了 frame 中的工作,我们可以这样返回父 frame:

driver.switch_to_default_content()

六、弹出对话框

Selenium WebDriver 内置了对处理弹出对话框的支持。 在你的某些动作之后可能会触发弹出对话框,你可以像下面这样访问对话框:

alert = driver.switch_to_alert()

它将返回当前打开的对话框对象。使用此对象,您现在可以接受、取消、读取其内容, 甚至可以在 prompt 对话框中输入(译注:prompt() 是对话框的一种,不同于 alert() 对话框,不同点可以自行百度)。 这个接口对 alert, confirm, prompt 对话框效果相同。 参考相关的API文档获取更多信息。

七、访问浏览器历史记录

在之前的文章中,我们使用get命令打开一个页面, ( driver.get(“http://www.example.com”)),WebDriver 有很多更小的,以任务为导向的接口, navigation 就是一个有用的任务,打开一个页面你可以使用get:

driver.get("http://www.example.com")

在浏览历史中前进和后退你可以使用:

driver.forward()
driver.back()

请注意,这个功能完全取决于底层驱动程序。当你调用这些方法的时候,很有可能会发生意想不到的事情, 如果你习惯了浏览器的这些行为和其他的不同。(原文:It’s just possible that something unexpected may happen when you call these methods if you’re used to the behaviour of one browser over another.)

八、操作Cookies

在我们结束这一节之前,或许你对如何操作 Cookies 可能会很感兴趣。 首先,你需要打开一个页面,因为 Cookie 是在某个域名下才生效的:

# 打开一个页面 
driver.get(“http://www.example.com”)
# 现在设置Cookies,这个cookie在域名根目录下(”/”)生效 cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’} 
driver.add_cookie(cookie)
# 现在获取所有当前URL下可获得的Cookies 
driver.get_cookies()