用title_contains来检查我们打开的页面是否正确;以及元素定位方式id、classname、name、xpath
用class name时,可能会定位到多个元素,那就找父元素class定位。先定义一个变量,再用这个变量来找子元素的定位。注意element的单复数!
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.5itest.cn/register")
time.sleep(5)
print(EC.title_contains("注册"))
driver.find_element(By.ID, "register_email").send_keys("1139483036@qq.com")
user_name_element_node = driver.find_elements(By.CLASS_NAME, "controls")[1]
user_element = user_name_element_node.find_element(By.CLASS_NAME,
"form-control")
user_element.send_keys("zhangyujie")
driver.find_element(By.NAME, "password").send_keys("12121212")
driver.find_element(By.XPATH,
"//*[@id='captcha_code']").send_keys("12121212")
time.sleep(5)
使用Expected_conditions来判断页面元素是否存在?可见?引入EC模块和WaitWebDriver模块
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("http://www.5itest.cn/register")
time.sleep(5)
print(EC.title_contains("注册"))
locator=(By.CLASS_NAME,"controls")
WebDriverWait(driver,1).until(EC.visibility_of_element_located(locator))
driver.close()
输入注册用户名并获取用户信息
email_element = driver.find_element(By.ID, "register_email")
print(email_element.get_attribute("placeholder"))
email_element.send_keys("1139483036@qq.com")
print(email_element.get_attribute("value"))
driver.close()
如何生成用户名
import random
for i in range(5):
user_email = random.sample('1234567890abcdefg', 5)
print(user_email)
这样生成的是一个序列list 不是我们要的字符串,用'' .join 。再加上@qq.com字符串
user_email = ''.join(random.sample('1234567890abcdefg', 9))+"@qq.com"
如何解决验证码问题:全屏浏览器,截图,定位验证码的坐标,找出ABCD点,再对截图裁剪得到验证码的图片(*2!!注意电脑的显示比例问题,我电脑是200%显示的,不然location定位不准确)
from PIL import Image
driver = webdriver.Chrome()
driver.get("http://www.5itest.cn/register")
driver.maximize_window()
email_element = driver.find_element(By.ID, "register_email")
driver.save_screenshot("E:\Imooc\seleniumpython\Imooc_selenium\imooc.png")
code_element = driver.find_element(By.ID, "getcode_num")
print(code_element.location) # (x:123,y:345)
print(code_element.size)
# 描绘出来ABCD四个点
left = code_element.location['x'] * 2 # A
top = code_element.location['y'] * 2 # C
right = code_element.size['width']*2+left # B
down = code_element.size['height']*2+top # D
im = Image.open("E:\Imooc\seleniumpython\Imooc_selenium\imooc.png")
img = im.crop((left, top, right, down))
img.save("E:\Imooc\seleniumpython\Imooc_selenium\imooc1.png")
识别验证码!用超级鹰!
import requests
from hashlib import md5
#Chaojiying_Client已经封装在了文件夹的识别程序,直接调用就行
from Chaojiying_Client import Chaojiying_Client
#超级鹰用户名,密码,id
chaojiying = Chaojiying_Client('zhangyujie', 'qwer1234', '950821')
im = open('E:/Imooc/seleniumpython/Imooc_selenium/test02.png', 'rb').read()
#1902是识别验证码的类型,可以去文档里找
text = chaojiying.PostPic(im, 1902)['pic_str']
print(text)
注册流程代码封装,把每一个模块封装成一个个函数
# coding=utf-8
from selenium import webdriver
import time
import random
import requests
from PIL import Image
from selenium.webdriver.common.by import By
from hashlib import md5
from Chaojiying_Client import Chaojiying_Client
driver = webdriver.Chrome()
# 浏览器初始化
def driver_init():
driver.get("http://www.5itest.cn/register")
driver.maximize_window()
time.sleep(5)
# 获取element信息
def get_element(id):
element = driver.find_element(By.ID, id)
return element
# 获取随机数
def get_range_user():
user_info = ''.join(random.sample('1234567890abcdefghijklmn', 8))
return user_info
# 获取图片
def get_code_image(file_name):
driver.save_screenshot(file_name)
code_element = driver.find_element(By.ID, "getcode_num")
left = code_element.location['x']*2
top = code_element.location['y']*2
right = code_element.size['width']*2+left
height = code_element.size['height']*2+top
im = Image.open(file_name)
img = im.crop((left, top, right, height))
img.save(file_name)
# 解析图片获取验证码
def code_online(file_name):
chaojiying = Chaojiying_Client('zhangyujie', 'qwer1234', '950821')
im = open(file_name, 'rb').read()
text = chaojiying.PostPic(im, 1902)['pic_str']
return text
# 运行主程序
def run_main():
user_name_info = get_range_user()
user_email = user_name_info+"@163.com"
file_name = "E:/Imooc/seleniumpython/Imooc_selenium/test02.png"
driver_init()
get_element("register_email").send_keys(user_email)
get_element("register_nickname").send_keys(user_name_info)
get_element("register_password").send_keys("111111")
get_code_image(file_name)
text = code_online(file_name)
get_element("captcha_code").send_keys(text)
get_element("register-btn").click()
time.sleep(5)
driver.close()
run_main()
以配置文件形式实现定位设计思想(因为用户名邮箱密码有可能是会变 的)
新建一个config文件夹,在里面新建一个LocalElement.ini文件作为配置文件,把用户信息写进去
[RegisterElement]
user_email=id>register_email
user_email_error=id>register_email-error
user_name=id>register_nickname
user_name_error=id>register_nickname-error
password=id>register_password
password_error=id>register_password-error
code_image=id>getcode_num
code_text=id>captcha_code
code_text_error=id>captcha_code-error
register_button=id>register-btn
怎么读取配置文件呢?新建init.py
# coding=utf-8
import configparser
class ReadIni(object):
# 初始化下面函数里的参数变量
def __init__(self, file_name=None, node=None):
if file_name == None:
file_name = "e:/Imooc/seleniumpython/config/LocalElement.ini"
if node == None:
self.node = 'RegisterElement'
else:
self.node = node
self.cf = self.load_ini(file_name)
# 加载文件
def load_ini(self, file_name):
cf = configparser.ConfigParser()
# 这里的地址是活的,不能写死;所以把"e:/Imooc/seleniumpython/config/LocalElement.ini"换成file_name
cf.read(file_name)
return cf
# 获取value值
def get_value(self, key):
data = self.cf.get(self.node, key)
return data
if __name__ == '__main__':
read_init = ReadIni()
print(read_init.get_value('user_name'))