python+selenium10----二次封装
显示等待----python+selenium----Selenium的3种等待方式
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
"""
Example:
from selenium.webdriver.support.ui import WebDriverWait
#10秒内每0.5秒循环查找元素,找到就返回元素本身,找不到跑出异常
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))
#30秒内每隔1秒循环查找元素,判断元素有没有消失(不显示),找不到元素返回Ture,找到跑出异常(忽略元素不可见异常TimeoutException)
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id("someId").is_displayed())
"""
driver = webdriver.Firefox()
driver.get('http://127.0.0.1/zentao/user-login.html')
ele1 = WebDriverWait(driver, 10, 0.5).until(lambda x: x.find_element_by_id("account"))
ele1.send_keys("admin")
ele2 = WebDriverWait(driver, 10, 0.5).until(lambda x: x.find_element_by_name("password"))
ele2.send_keys("123456")
ele3 = WebDriverWait(driver, 10, 0.5).until(lambda x: x.find_element_by_id("submit"))
ele3.click()
ele4 = WebDriverWait(driver, 10, 0.5).until(lambda x: x.find_element_by_css_selector("#userMenu>a")).text
print(ele4)
定位方式参数化
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.get('http://www.baidu,com')
#定位方法参数化,合并八种定位方式
#用By.ID方法和直接输入参数方法实现效果是一样的
"""
class By(object):
#Set of supported locator strategies.
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
"""
driver.find_element(By.ID, 'kw').send_keys("ById")
driver.find_element("id", "kw").send_keys("selenium")
driver.find_element("xpath", ".//*[@id='kw']")
driver.find_element("css selector", "#kw")
封装方法
在common中新增base.py
#base.py
from selenium.webdriver.support.ui import WebDriverWait
class Base():
def __init__(self, driver):
self.driver = driver
# 封装方法
# 对selenium原生的查找元素方法进行二次封装,
# 30秒内循环查找页面上有没有耨个元素
def findElement(self, locator, timeout=30):
'''
locator 参数是定位方式,如("id", "kw"),把两个参数合并为一个
*号是把两个参数分开传值
Usage:
locator = ("id", "kw")
driver.find_element(*locator)`
'''
element = WebDriverWait(self.driver, timeout, 1).until(lambda x: x.find_element(*locator))
return element
def send(self, locator, text):
"""封装输入文本方法"""
ele = self.findElement(locator)
ele.send_keys(text)
def click(self, locator):
"""封装点击方法"""
self.findElement(locator).click()
def clear(self, locator):
"""封装清空输入框方法"""
self.findElement(locator).clear()
def get_text(self, locator):
"""封装获取文本信息方法"""
ele = self.findElement(locator)
return ele.text
修改
gonggonglei.py
#gonggonglei.py
from common.base import Base
from time import sleep
class GongGongLei(Base):
"""公共类"""
loc1 = ("id", "account")
loc2 = ("name", "password")
loc3 = ("id", "submit")
loc4 = ("css selector", "#userMenu>a")
def Login(self, username, password):
"""登录方法"""
self.clear(self.loc1)
self.send(self.loc1, username)
self.clear(self.loc2)
self.send(self.loc2, password)
self.click(self.loc3)
def Is_login(self):
t = ""
try:
t = self.get_text(self.loc4)
print("成功获取信息:%s" % t)
except:
t = ""
return t
def is_alert_exist(self):
try:
sleep(2)
alert = self.driver.switch_to.alert
text = alert.text
alert.accept()
return text
except:
return ""