class TestFindTable(unittest.TestCase):
    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_css_selector(self):
        # 获取整个table对象
        table = self.browser.find_element_by_id("table")
        # 获取所有行
        tr_list = table.find_elements_by_tag_name("tr")
        # 先断言获取的行数是否正确
        assert len(tr_list) == 5, "表格行数错误!"

        for row in tr_list:
            # td_list =
            row.find_elements_by_tag_name("td")
            # for col in td_list:
            #     print(col.text, end="\t")
            # print()

        # 获取表格第二行第二列单元格,获取表格内容必须先通过 tbody
        self.browser.find_element_by_xpath(
            "//*[@id='table']/tbody/tr[2]/td[2]")
        self.browser.find_element_by_css_selector(
            "table#table > tbody > tr:nth-child(2) > td:nth-child(2)")

        # 获取表格的子元素 input 的value值
        cream = self.browser.find_element_by_xpath(
            "//td[contains(., '化妆')]/input[1]").get_attribute("value")
        self.assertEqual(cream, "面霜", "找不到面霜文本!")
Exemple #2
0
class TestByCssSelector(unittest.TestCase):

    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_css_selector(self):
        # 用最对定位,查找第一个div中的 “查询” 按钮
        self.browser.find_element_by_css_selector("html > body > div > input[value='查询']")

        # 用相对定位,查找第一个div中的 “查询” 按钮
        self.browser.find_element_by_css_selector("input[value='查询']")

        # 通过class定位
        self.browser.find_element_by_css_selector("a.orange")

        # 通过ID定位
        self.browser.find_element_by_css_selector("input#div1input")

        # 使用页面其他元素定位
        self.browser.find_element_by_css_selector("img[alt='div1-img1']")
        self.browser.find_element_by_css_selector("img[alt='div1-img1'][href='https://www.sogou.com']")

        # 使用属性的部分内容定位,符号与等号之间不能有空格,如 “href ^ = ”是错误的
        self.browser.find_element_by_css_selector("a[href ^='https://www.so']")  # 以 https://www.so 开头的href属性
        self.browser.find_element_by_css_selector("a[href $='gou.com']")  # 以 gou.com 结尾的href属性
        self.browser.find_element_by_css_selector("a[href *='so']")  # 包含 so 的href属性

        # 查找子元素
        self.browser.find_element_by_css_selector("div#div1 > input#div1input")
        # 查找后代元素,一般不止1个所以是 elements
        self.browser.find_elements_by_css_selector("div input")

        # 伪类定位,前三个定位的冒号前一定要有空格,否则无法正确定位
        self.browser.find_element_by_css_selector("div#div1 :first-child")  # 找到第一个子元素
        self.browser.find_element_by_css_selector("div#div1 :nth-child(2)")  # 找到第二个子元素,若要找第三个则 nth-child(3)
        self.browser.find_element_by_css_selector("div#div1 :last-child")  # 找到最后一个子元素
        self.browser.find_element_by_css_selector("input:focus")  # 找到当前获取焦点的input元素
        self.browser.find_elements_by_css_selector("input:enabled")  # 找到当前可操作的input元素
        self.browser.find_elements_by_css_selector("input:checked")  # 找到当前已勾选的input元素
        self.browser.find_element_by_css_selector("input:not([id])")  # 找到当前没有 id 属性的input元素

        # 查找同级兄弟元素
        # 查找id为div1的 div 元素下跟 input 元素同级且临近 input 元素的元素 a
        self.browser.find_element_by_css_selector("div#div1 > input + a")
        # 查找id为div1的 div 元素下跟 input 和 a 元素同级且临近 a 元素的元素 img
        self.browser.find_element_by_css_selector("div#div1 > input + a + img")
        # 查找id为div1的 div 元素下跟 input 和 任意类型的元素同级且临近这个任意类型元素的元素 img,* 只能代表一个任意类型元素
        self.browser.find_element_by_css_selector("div#div1 > input + * + img")
        # 查找id为 recordlist 的 ul 元素下,查找 p 元素后的所有 li 元素
        self.browser.find_elements_by_css_selector("ul#recordlist > p ~ li")

        # 同时获取多个元素,id为div1的div、所有input 和 所有a
        self.browser.find_elements_by_css_selector("div#div1,input,a")
class TestByClassName(unittest.TestCase):
    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_class_name(self):
        self.browser.find_element_by_class_name("orange")
        self.browser.find_element_by_class_name("cadet")
class TestByLinkText(unittest.TestCase):
    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_link_text(self):
        self.browser.find_element_by_link_text("百度搜索")
        self.browser.find_element_by_link_text("搜狗搜索")
Exemple #5
0
class TestByName(unittest.TestCase):
    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_name(self):
        self.browser.find_element_by_name("username")
        self.browser.find_element_by_name("password")
        self.browser.find_element_by_name("submit")
Exemple #6
0
class TestByTagName(unittest.TestCase):

    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_tag_name(self):
        self.browser.find_element_by_tag_name("input")
        self.browser.find_element_by_tag_name("a")
class TestAction(unittest.TestCase):
    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_css_selector(self):
        sleep(5)
        bai_du_img = self.browser.find_element_by_xpath(
            "//img[@alt='div2-img2']")
        ActionChains(self.browser).move_to_element_with_offset(
            bai_du_img, 370, 272).click().perform()
        sleep(5)
Exemple #8
0
class TestById(unittest.TestCase):
    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.report_dir = ReportDirectory()
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_id(self):
        try:
            self.browser.find_element_by_id("username")
            self.browser.find_element_by_id("passwords")
        except Exception:
            self.report_dir.get_screenshot(self.browser)
            raise
 def setUp(self):
     self.browser = Browser().browser(location="../../lib/chromedriver.exe")
     self.common = Common(self.browser)
     self.common.get()
class TestByXpath(unittest.TestCase):
    def setUp(self):
        self.browser = Browser().browser(location="../../lib/chromedriver.exe")
        self.common = Common(self.browser)
        self.common.get()

    def tearDown(self):
        self.browser.quit()

    def test_find_element_by_xpath(self):
        """ ----------------------- """
        """ 1. 使用绝对路径,以单斜杠“/”开头,但脆弱 """
        self.browser.find_element_by_xpath("/html/body/div/input[@value='查询']")
        """ 2. 使用相对路径,以双斜杠“//”开头 """
        self.browser.find_element_by_xpath("//input[@value='查询']")
        """ 3. 使用索引号 """
        # 若改为input[3]会报错,因为起始位置为每个div,而被测试HTML文件里,每个div下最多只有2个input标签
        self.browser.find_element_by_xpath("//input[2]")
        # 定位最后一个div元素的a标签
        self.browser.find_element_by_xpath("//div[last()]/a")
        # 定位倒数第二个div元素的a标签
        self.browser.find_element_by_xpath("//div[last()-1]/a")
        # 获取当前元素 input 的位置序列号,且条件为小于2
        self.browser.find_element_by_xpath("//div/input[position()<2]")
        """ 4. 使用页面元素定位 """
        # 定位被测试页中第一张 img 元素
        self.browser.find_element_by_xpath("//img[@alt='div1-img1']")
        # 定位页面第一张图片
        self.browser.find_element_by_xpath(
            "//img[@href='https://www.sogou.com']")
        # 定位页面第二个div中第一个input输入框
        self.browser.find_element_by_xpath(
            "//div[@id='div2']/input[@name='div2input']")
        # 定位第一个div中第一个链接
        self.browser.find_element_by_xpath(
            "//div[@id='div1']/a[@href='https://www.sogou.com']")
        # 定位页面的查询按钮
        self.browser.find_element_by_xpath("//input[@type='button']")
        """ 5. 使用模糊属性值定位,适合在很多场景使用 """
        # 定位 alt 属性的属性值以“div1”关键字开头的元素
        self.browser.find_element_by_xpath("//img[starts-with(@alt,'div1')]")
        # 定位 alt 属性的属性值包含“img”关键字的元素,包含即可,无须考虑位置
        self.browser.find_element_by_xpath("//img[contains(@alt,'img1')]")
        """ 6. 轴定位,先找到一个相对好定位的元素,再以它为轴,根据它和要定位元素间的相对位置关系进行定位,可解决一些元素难定位的问题 """
        # --- parent 选取当前节点的父节点
        self.browser.find_element_by_xpath(
            "//img[@alt='div2-img2']/parent::div")
        # --- child 选取当前节点的所有子节点
        self.browser.find_element_by_xpath("//div[@id='div1']/child::img")
        # --- ancestor 选取当前节点的所有先辈节点
        self.browser.find_element_by_xpath(
            "//img[@alt='div2-img2']/ancestor::div")
        # --- descendant 选取当前节点的所有后代节点
        self.browser.find_element_by_xpath("//div[@id='div2']/descendant::img")
        # --- following 选取当前节点的开始标签之后的所有节点
        self.browser.find_element_by_xpath("//div[@id='div1']/following::img")
        # --- following-sibling 选取当前节点之后的所有同级节点
        self.browser.find_element_by_xpath(
            "//a[@href='https://www.baidu.com']/following-sibling::input")
        # --- preceding 选取当前节点的开始标签之前的所有节点
        self.browser.find_element_by_xpath(
            "//img[@alt='div2-img2']/preceding::div")
        # --- preceding-sibling 选取当前节点之前的所有同级节点
        self.browser.find_element_by_xpath(
            "//input[@value='查询']/preceding-sibling::a[1]")
        # 轴后加 * ,表示通配符,找到 value 为 “查询”的input元素前面的所有同级元素,但不包括input本身
        self.browser.find_element_by_xpath(
            "//input[@value='查询']/preceding-sibling::*")
        """ 7. 使用表达式 """
        # (1)使用 text() 函数定位文本
        self.browser.find_element_by_xpath("//a[text()='搜狗搜索']")
        # (2) “.” 与 text() 等价
        self.browser.find_element_by_xpath("//a[.='搜狗搜索']")
        # (3) 使用模糊匹配方法,搭配文本定位
        self.browser.find_element_by_xpath("//a[contains(.,'百度')]")
        # (4) 与(3)等价
        self.browser.find_element_by_xpath("//a[contains(text(),'百度')]")
        # (5)选择上层父元素 div
        self.browser.find_element_by_xpath(
            "//a[contains(text(),'百度')]/preceding::div")
        # (6)“..” 与 preceding::div 等价
        self.browser.find_element_by_xpath("//a[contains(text(),'百度')]/..")
        """ 运算符 """
        # 获取两个或多个集合
        self.browser.find_elements_by_xpath("//div | //a | //input")
        # 索引号相加
        self.browser.find_element_by_xpath("//div[1+1]")
        # 索引号相减
        self.browser.find_element_by_xpath("//div[2-1]")
        # 索引号相乘
        self.browser.find_element_by_xpath("//div[1*2]")
        # 索引号相除,因为通常的除号“/”是特殊符号,所以XPath的除号是 div
        self.browser.find_element_by_xpath("//div[4 div 2]")
        """ 文本判断必须用 . 或者 text() """
        # 判断文本,等于
        self.browser.find_element_by_xpath("//div[text() =5]//span[. =2]")
        # 或者如下,即:用自己做判断的,需要用 text()= ,参照7(1),如果是用子节点做判断的,直接a[b=c]
        self.browser.find_element_by_xpath("//div[span =2]/span[. =2]")
        # 判断文本,不等于
        self.browser.find_element_by_xpath("//div[a !=10]")
        # 判断文本,小于
        self.browser.find_element_by_xpath("//span[text() <14]//div[a <11]")
        # 判断文本,小于等于
        self.browser.find_element_by_xpath("//span[text() <=13]//div[a <=8]")
        # 判断文本,大于
        self.browser.find_element_by_xpath("//a[text() >2]")
        # 判断文本,大于等于
        self.browser.find_element_by_xpath("//span[text() >=12]//div[a >=7]")
        # 判断文本,and
        self.browser.find_element_by_xpath("//span[text() >1 and text() <=5]")
        self.browser.find_element_by_xpath("//div[a <9 and span =12]")
        # 判断文本,or
        self.browser.find_element_by_xpath("//span[text() =10 or text() =13]")
        self.browser.find_element_by_xpath("//div[a<=8 or span=13]")
        # 判断文本,mod 取余
        self.browser.find_element_by_xpath("//div[7 mod 3]")  # 7 mod 3 = 1
        self.browser.find_element_by_xpath("//span[11 mod 3]")  # 11 mod 3 = 2
Exemple #11
0
 def setUp(self):
     self.browser = Browser().browser(location="../../lib/chromedriver.exe")
     self.report_dir = ReportDirectory()
     self.common = Common(self.browser)
     self.common.get()