Selenium结合Xpath使用

一、Selenium安装

Python3.x 安装后就默认就会有 pip(pip.exe默认在python的Scripts路径下),打开 cmd,使用pip安装selenium:

pip install selenium

查看是否安装成功 

pip show selenium 

 mac电脑,把 pip 换成 pip3

二、Xpath

1、id定位

Xpath在浏览器Console中可以使用$x(' ')的方式进行练习: $x('//*[@name="wd"]')

Selector在浏览器Console中可以使用$(' ')的方式进行练习: $('#kw')

import time

from selenium import webdriver
from selenium.webdriver.common.by import By


class TestWait:
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://www.baidu.com/')

    def test_wait(self):
        # self.driver.find_element(By.CSS_SELECTOR, '#kw').send_keys("特斯拉")
        # self.driver.find_element(By.CSS_SELECTOR, 'id=kw').send_keys("特斯拉")
        # self.driver.find_element(By.ID, 'kw').send_keys("特斯拉")
        # time.sleep(1)
        # self.driver.find_element(By.ID, 'su').click()
        # time.sleep(2)
        self.driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys("特斯拉")
        time.sleep(1)
        self.driver.find_element(By.XPATH, '//*[@id="su"]').click()
        time.sleep(10)
        self.driver.find_element(By.XPATH, '//*[@id="1"]/div/div[1]/h3/a[1]').click()
        time.sleep(3)

2、鼠标单击、双击、右击、悬停、拖拽、页面滚动、表单

from time import sleep

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By


class TestActionChains:
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)

    def teardown(self):
        self.driver.quit()

    # 单击、双击、右击
    def test_case_click(self):
        self.driver.get("https://sahitest.com/demo/clicks.htm")
        element_click = self.driver.find_element(By.XPATH, "//input[@value='click me']")
        element_doubleclick = self.driver.find_element(By.XPATH, "//input[@value='dbl click me']")
        element_rightclick = self.driver.find_element(By.XPATH, "//input[@value='right click me']")

        aciton = ActionChains(self.driver)
        aciton.click(element_click)
        aciton.double_click(element_doubleclick)
        aciton.context_click(element_rightclick)
        sleep(3)
        # 执行
        aciton.perform()
        sleep(3)

    # 鼠标移动(悬停)
    def test_move_to_element(self):
        self.driver.get("http://www.baidu.com")
        ele = self.driver.find_element(By.XPATH, "//*[@id='s-usersetting-top']")
        action = ActionChains(self.driver)
        action.move_to_element(ele)
        action.perform()
        sleep(3)

    # 拖拽
    def test_drag_drop(self):
        self.driver.get("https://sahitest.com/demo/dragDropMooTools.htm")
        drag_element = self.driver.find_element(By.XPATH, "//*[@id='dragger']")
        drop_element1 = self.driver.find_element(By.XPATH, "/html/body/div[2]")
        drop_element2 = self.driver.find_element(By.XPATH, "/html/body/div[3]")
        action = ActionChains(self.driver)
        action.drag_and_drop(drag_element, drop_element1).perform()  # 拖拽的方式一
        sleep(2)
        action.click_and_hold(drag_element).move_to_element(drop_element2).release().perform()  # 拖拽的方式一
        sleep(2)


    # 页面滚动
    def test_touchAction_scrollbottom(self):
        self.driver.get("https://www.baidu.com")
        el = self.driver.find_element(By.ID, "kw")
        el_search = self.driver.find_element(By.ID, "su")

        action = ActionChains(self.driver)
        el.send_keys("特斯拉")
        el_search.click()
        sleep(1)

        js = "window.scrollTo(0, 10000)"
        self.driver.execute_script(js)
        sleep(3)

        action.perform()

    # 表单
    def test_form(self):
        self.driver.get("https://login.sina.com.cn/signup/signin.php?entry=homepage&entry=homepage")
        name = self.driver.find_element(By.ID, "username")
        pw = self.driver.find_element(By.ID, "password")
        su = self.driver.find_element(By.XPATH, "//*[@id='vForm']/div[2]/div/ul/li[7]/div[1]/input")

        action = ActionChains(self.driver)
        name.send_keys("xiaoming")
        print(name.get_attribute("value"))  # 打印用户名
        sleep(1)
        pw.send_keys(123)
        print(pw.get_attribute("value"))
        sleep(1)
        su.click()
        sleep(1)

        action.perform()

3、多窗口切换

from time import sleep

from selenium import webdriver


class TestWindows():
    def test_window(self):
        self.driver = webdriver.Chrome()
        # 1、打开浏览器窗口
        self.driver.get("https://sahitest.com/demo/")

        handle = self.driver.current_window_handle
        print('当前的窗口句柄是:', handle)
        print('当前的url:', self.driver.current_url)

        # 2、点击页面中的超链接触发多窗口
        self.driver.find_element("link text", "Window Open Test").click()
        sleep(2)

        # 3、获取所有窗口句柄
        handles = self.driver.window_handles
        print('所有的窗口句柄是:', handles)

        # 4、 进入新窗口
        self.driver.switch_to.window(handles[1])
        print('新窗口的url:', self.driver.current_url)
        sleep(2)

        # 5、退出新窗口
        # 想去那个窗口就写哪个窗口的索引;这里就可以写handle,也可以写handles[0]
        self.driver.switch_to.window(handle)
        sleep(3)

        # 6、关闭浏览器
        self.driver.quit()

driver.window_handles获取当前打开浏览器所有窗口句柄,通常是按照顺序打开的,改方法返回的为list列表,所以可以通过返回列表的索引取出窗口句柄
driver.switch_to.window的传入参数为窗口句柄,根据上面获得的句柄,传入该方法,即可实现窗口的切换

多窗口处理知识点:

driver.window_handles,获取当前driver打开的窗口句柄列表,根据需要操作的窗口的索引使用switch_to.window()进行窗口的切换

4、网页fream

from selenium import webdriver
from selenium.webdriver.common.by import By


class TestFrames():
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
        self.driver.maximize_window()
        self.driver.implicitly_wait(2)

    def teardown(self):
        self.driver.quit()

    def test_fream(self):
        # 进入frame元素下
        self.driver.switch_to.frame("iframeResult")  # 写法一
        # self.driver.switch_to_frame("iframeResult") # 写法二
        print(self.driver.find_element(By.ID, "draggable"))

        # 切出frame元素
        # self.driver.switch_to.parent_frame()  # 写法一
        self.driver.switch_to.default_content()  # 写法二
        print(self.driver.find_element(By.ID, "submitBTN"))

frame处理知识点:

switch_to.frame,传入frame的id,即可进入对应的frame,返回上一层用parent_frame(),返回初始页面使用default_content()或者使用parent_frame()也可以

5、link_text定位

from selenium import webdriver


class TestSelenium():
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()  # 控制打开窗口
        self.driver.implicitly_wait(5)  # 最长等待5秒,5s后未找到元素则error

    def teardown(self):
        self.driver.quit()

    def test_baidu(self):
        self.driver.get("https://www.runoob.com/python/python-tutorial.html")
        self.driver.find_element_by_link_text("Python 基础语法").click()
        self.driver.find_element_by_link_text("Python 命令行参数").click()

三、selenium多浏览器处理

定义一个Base类,通过if语句判断browser传入的值而选择用什么浏览器驱动

import os

from selenium import webdriver


class Base():
    def setup(self):
        browser = os.getenv("browser")
        if browser == 'headless':
            self.driver = webdriver.PhantomJS()
        elif browser == 'firefox':
            self.driver = webdriver.Firefox()
        else:
            self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(2)

    def teardown(self):
        self.driver.quit()

通过命令行运行:

browser=chrome pytest test_xxx.py

四、selenium执行JS

1、selenium处理JS元素

    def test_js_scroll(self):
        self.driver.get("http://www.baidu.com")
        self.driver.find_element(By.ID, "kw").send_keys("selenium测试")
        element = self.driver.execute_script("return document.getElementById('su')")
        element.click()
        self.driver.execute_script("document.documentElement.scrollTop=10000")
        sleep(1)
        self.driver.find_element(By.XPATH, "//*[@id='page']/div/a[10]").click()
        sleep(2)
        for code in [
            'return document.title', 'return JSON.stringify(performance.timing)'
        ]:
            self.driver.execute_script(code)

2、JS处理时间控件

    def test_datetime(self):
        self.driver.get("https://www.12306.cn/index/")
        # 获取时间控件并移除readonly属性
        self.driver.execute_script("a=document.getElementById('train_date'); a.removeAttribute('readonly')")
        sleep(2)
        # 将时间控件的值修改为'2028-12-25'
        self.driver.execute_script("return document.getElementById('train_date').value='2028-12-25'")
        sleep(3)

五、文件上传、alert弹框

from time import sleep

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

from seleniumTest.base import Base


class TestFlie():
    def setup(self):
        self.driver = webdriver.Chrome()

    def teardown(self):
        self.driver.quit()

    """文件上传"""

    def test_file_upload(self):
        self.driver.get("https://image.baidu.com/")
        self.driver.find_element(By.XPATH, '//*[@id="sttb"]/img[1]').click()
        self.driver.find_element(By.ID, "stfile").send_keys(
            "E:/python/pycharm/pythonProject/pytestdemo/seleniumTest/baidu.png")
        sleep(6)

    """alter弹窗"""

    def test_alter(self):
        self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
        self.driver.switch_to.frame("iframeResult")
        drag = self.driver.find_element(By.XPATH, '//*[@id="draggable"]')
        drop = self.driver.find_element(By.XPATH, '//*[@id="droppable"]')

        action = ActionChains(self.driver)
        action.drag_and_drop(drag, drop).perform()
        sleep(4)

        # 获取alert内容
        text = self.driver.switch_to.alert
        print(text)

        # 点击alert弹框的'确认'按钮
        print("点击alert弹框的'确认'按钮")
        self.driver.switch_to.alert.accept()

        self.driver.switch_to.default_content()
        self.driver.find_element(By.ID, "submitBTN").click()
        sleep(3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值