(06)selenium页面元素定位02

比较好用的一些元素定位

一、Xpath

1、基本常用

页面上


selenium + python 获取元素

driver.find_element_by_xpath('//*[@id="iptIDCard"]').send_keys(idcard)  #输入身份证号码

2、确定页面上显示元素的文字

element = driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div/div/div[2]/div[4]/a').text
        print("element的值是:",element )

3、直接通过页面上显示的文字来获取元素

页面上


selenium + python 获取元素

driver.find_element_by_xpath('//div[contains(text(),"请选择")]').click()
# 当不确定是什么标签时
driver.find_element_by_xpath('//*[contains(text(),"请选择")]').click()

4、通过多个标签关联,查找出想要的元素

页面上


selenium + python 获取元素

driver.find_element_by_xpath("//input[@type='text'][@value='哇哈哈']").clear()  # 调用clear()方法去清除名字
# 或者是通过 placeholder=“文字”进行删除
# placeholder 是当输入框什么都没有输入时显示的内容,value 是显示输入框中输入的文字内容
driver.find_element_by_xpath("//input[@type='text'][@placeholder='身份证姓名']").clear()

5、找出当前标签下的兄弟标签

页面上

我的照片

selenium + python 获取元素

# 通过页面上的文字找到元素,但由于上传照片需要input,所以利用 following-sibling::input,找到input元素
driver.find_element_by_xpath('//*[contains(text(),"我的照片")]/following-sibling::input').send_keys('H:\\哇哈哈\\photo.jpg')

二、class_name

1、基本常用

页面上

获取验证码

selenium + python 获取元素

driver.find_element_by_class_name('code-btn ').click()      # 点击 获取验证码

三、元素获取超时

如果发现A元素时,执行test01;如果没有发现A元素时,执行test02

from selenium.common.exceptions import NoSuchElementException, TimeoutException
class Tool(object):
    def __init__(self, driver):
        self.driver = driver  # 这里不能再文件顶部导入webdriver,不然之后会有冲突
    def is_element_exit(self, identifyBy, c):
        '''
        Determine whether elements exist
        Usage:
        isElement(By.XPATH,"//a")
        '''
        flag = None
        try:
            if identifyBy == "xpath":
                # self.driver.find_element_by_xpath(c)
                wait = WebDriverWait(self.driver, 3)
                wait.until(EC.presence_of_element_located((By.XPATH, c)))  # 等待该xpath元素最多3s,找到则返回元素,否则抛异常
                # WebDriverWait(self.driver, 3, 0.8).until(lambda x: x.find_element_by_xpath(c))  # 等待XPATH元素可见 
            elif identifyBy == "id":
                self.driver.implicitly_wait(60)
                self.driver.find_element_by_id(c)
                self.driver.find_element_by_id(c).click()
            elif identifyBy == "name":
                 self.driver.find_element_by_name(c)
                 self.driver.find_element_by_name(c).click()
            flag = True
            print("can find: ", c)
        # except NoSuchElementException as e:
        except TimeoutException as e:
            flag = False
            print("获取元素超时因为{},无法找到{}元素", format(e, c))
            print("can't find: %s" % c)
        finally:
            return flag

调用这个方法

from common.tool import Tool

class TestEdrain(unittest.TestCase):
    def test_Flow(self):
            driver = self.driver
            driver.get(self.base_url)
            tool = Tool(driver)
            if tool.is_element_exit("xpath", '//*[@id="iptIDCard"]'):
                print("开始注册")
                edrain.test01()
            else:
                print("开始登录")
                edrain.test02()
 

TimeoutException:获取元素超时

NoSuchElementException:找不到该元素

等异常均会被捕捉。

小tip:

# 最长的等待时间取决于两者之间的大者。
# 如果隐性等待时间 > 显性等待时间,则该句代码的最长等待时间等于隐性等待时间。
 """
implicitly_wait():隐式等待
 当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常。换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
  一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式等待会让一个正常响应的应用的测试变慢,它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
  所以:::隐式等待 慎用。
  """
---------
driver.implicitly_wait(30)  # 隐式等待
--------
wait = WebDriverWait(self.driver, 3)
wait.until(EC.presence_of_element_located((By.XPATH, c)))  # 显示等待

四、断言

1、包含关系assertIn(A, B)------B 中包含 A

ele_string = driver.find_element_by_xpath('//*[@id="app"]/div/div/div[2]/div/div/div[1]/p[1]').text
assertIn(u"系统正在审批您提交的申请", ele_string)

2、相等关系assertEqual(A, B)------A和B相等

assertEqual(a,b,msg=msg)   #判断a与.b是否一致,msg类似备注,可以为空

你可能感兴趣的:((06)selenium页面元素定位02)