1. 程式人生 > 實用技巧 >Selenium3+python3自動化(三十六)--expected_conditions模組 判斷文字(text_to_be_present_in_element)

Selenium3+python3自動化(三十六)--expected_conditions模組 判斷文字(text_to_be_present_in_element)

前言

在做結果判斷的時候,經常想判斷某個元素中是否存在指定的文字,如登入後判斷頁面中賬號是否是該使用者的使用者名稱。

在前面的登入案例中,寫了一個簡單的方法,但不是公用的,在EC模組有個方法是可以專門用來判斷元素中存在指定文字的:text_to_be_present_in_element。

另外一個差不多的方法判斷元素的value值:text_to_be_present_in_element_value。

一、原始碼分析

#判斷元素中是否存在指定的文字,引數:locator,text

#__call__裡返回的是布林值:True和False

class text_to_be_present_in_element(object):
    """ An expectation for checking if the given text is present in the
    specified element.
    locator, text
    """
    def __init__(self, locator, text_):
        self.locator = locator
        self.text = text_

    def __call__(self, driver):
        try:
            element_text = _find_element(driver, self.locator).text
            return self.text in element_text
        except StaleElementReferenceException:
            return False

二、判斷文字

1.判斷百度首頁上,“新聞”按鈕這個元素中存在文字:新聞

2.locator引數是定位的方法(定位方法與find_element()一致)

3.text引數是期望的值

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.find_element("xpath","//div[@id='s-top-left']/a[1]").text)
#成功
rs=EC.text_to_be_present_in_element(("xpath","//div[@id='s-top-left']/a[1]"),"新聞")(driver)
print(rs)
#失敗
rs1=EC.text_to_be_present_in_element(("xpath","//div[@id='s-top-left']/a[1]"),"地圖")(driver)
print(rs1)

 執行結果: 

新聞
True
False

 三、判斷value的方法

1.原始碼如下

class text_to_be_present_in_element_value(object):
    """
    An expectation for checking if the given text is present in the element's
    locator, text
    """
    def __init__(self, locator, text_):
        self.locator = locator
        self.text = text_

    def __call__(self, driver):
        try:
            element_text = _find_element(driver,
                                         self.locator).get_attribute("value")
            if element_text:
                return self.text in element_text
            else:
                return False
        except StaleElementReferenceException:
                return False

 2.這個方法跟上面的差不多,只是這個是判斷的value的值

3.這裡舉個簡單案例,判斷百度搜索按鈕的value值(注意無value屬性不會報錯,會返回False)

參考程式碼:

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
rs=EC.text_to_be_present_in_element_value(("id","su"),"百度一下")(driver)
print(rs)
rs1=EC.text_to_be_present_in_element_value(("xpath","//div[@id='s-top-left']/a[1]"),"新聞")(driver)
print(rs1)

執行結果:

True
False

四、小結

EC.text_to_be_present_in_element(locator,text)

EC.text_to_be_present_in_element_value(locator,text)

locator的寫法與find_element()的語法一致;

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
rs=EC.text_to_be_present_in_element_value(("id","su"),"百度一下")(driver)
print(rs) #True
rrs=driver.find_element("id","su")
print(rrs.get_attribute("value")) #百度一下
print(dir(rrs),rrs.text) #rrs的屬性和方法,空
#下面text無內容,返回False
print(EC.text_to_be_present_in_element(("id","su"),"百度一下")(driver)) #False

#下面無value屬性,不報錯,返回False
rs1=EC.text_to_be_present_in_element_value(("xpath","//div[@id='s-top-left']/a[1]"),"新聞")(driver)
print(rs1) #False
print(driver.find_element("xpath","//div[@id='s-top-left']/a[1]").text) #新聞
print(EC.text_to_be_present_in_element(("xpath","//div[@id='s-top-left']/a[1]"),"新聞")(driver)) #True

執行結果:

True
百度一下
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_execute', '_id', '_parent', '_upload', '_w3c', 'clear', 'click', 'find_element', 'find_element_by_class_name', 'find_element_by_css_selector', 'find_element_by_id', 'find_element_by_link_text', 'find_element_by_name', 'find_element_by_partial_link_text', 'find_element_by_tag_name', 'find_element_by_xpath', 'find_elements', 'find_elements_by_class_name', 'find_elements_by_css_selector', 'find_elements_by_id', 'find_elements_by_link_text', 'find_elements_by_name', 'find_elements_by_partial_link_text', 'find_elements_by_tag_name', 'find_elements_by_xpath', 'get_attribute', 'get_property', 'id', 'is_displayed', 'is_enabled', 'is_selected', 'location', 'location_once_scrolled_into_view', 'parent', 'rect', 'screenshot', 'screenshot_as_base64', 'screenshot_as_png', 'send_keys', 'size', 'submit', 'tag_name', 'text', 'value_of_css_property'] 
False
False
新聞
True