美文网首页
selenium入门

selenium入门

作者: D_w | 来源:发表于2021-11-26 17:24 被阅读0次

这里的selenium使用的版本为3.141.0,安装时使用命令 pip install selenium==3.141.0

元素定位

image.png

这些都有对应的复数形式,如find_elements_by_id等,他们会将符合匹配要求的全部元素以list返回。
还可以以get_element(self, by=By.ID, value=None)来获取各种元素,第二个参数默认是By.ID,也可改为By.XPATH,By.NAME等,如:

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

def get_element(driver,*loc):
    e = driver.find_element(*loc)
    return e

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com/')
    get_element(driver,By.ID,'kw').send_keys('selenium')
    get_element(driver,By.XPATH,'//*[@id="su"]').click()

WebDriver属性

常用属性有如下:


image.png
from selenium import webdriver
from time import sleep


class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://www.baidu.com')
        self.driver.maximize_window()

    def test_prop(self):
        print(self.driver.name) # 浏览器名称
        print(self.driver.current_url)
        print(self.driver.title)
        print(self.driver.window_handles)
        print(self.driver.page_source)
        self.driver.quit()

    def test_method(self):
        self.driver.find_element_by_id('kw').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        sleep(2)
        self.driver.back()
        sleep(2)
        self.driver.refresh()
        sleep(2)
        self.driver.forward()


if __name__ == '__main__':
    case = TestCase()
    case.test_method()

WebElement属性和方法

属性
方法
from selenium import webdriver
from time import sleep

class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://sahitest.com/demo/linkTest.htm')

    def test_webelement_prop(self):
        e = self.driver.find_element_by_id('t1')
        print(type(e))
        print(e.id)
        print(e.tag_name)
        print(e.size)
        print(e.rect)
        print(e.text)

    def test_webelement_method(self):
        e = self.driver.find_element_by_id('t1')
        e.send_keys('hello world')
        sleep(2)

        print(e.get_attribute('type'))
        print(e.get_attribute('name'))

        print(e.value_of_css_property('font'))
        print(e.value_of_css_property('color'))
        sleep(2)
        e.clear()

if __name__ == '__main__':
    case = TestCase()
    # case.test_webelement_prop()
    case.test_webelement_method()
------------------输出----------------
text

normal normal 400 normal 13.3333px / normal Arial
rgba(0, 0, 0, 1)

操作form表单

首先在py文件的同级目录中创建forms.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="javascript:alert('hello')">
    Username:<input type="text" name="username" id="username"><br>
    Password:<input type="password" name="pwd" id="pwd"><br>
    <input type="submit" value="submit" id="submit">
</form>
</body>
</html>

在demo.py中进行操作

from selenium import webdriver
import os
from time import sleep

class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        path = os.path.dirname(os.path.abspath(__file__))
        file_path = 'file:///'+path+'/forms.html'
        print(file_path)
        self.driver.get(file_path)

    def test_login(self):
        username = self.driver.find_element_by_id('username')
        username.send_keys('admin')
        pwd = self.driver.find_element_by_id('pwd')   # 定位表单元素
        pwd.send_keys('123')     # 输出测试值
        print(username.get_attribute('value'))    # 输出表单元素属性
        print(pwd.get_attribute('value'))
        sleep(2)
        self.driver.find_element_by_id('submit').click()     # 表单提交
        self.driver.switch_to.alert.accept()    # 点击确认

        pwd.clear()
        username.clear()


if __name__ == '__main__':
    case = TestCase()
    case.test_login()

操作checkoutbox多选框和radiobutton单选框

首先创建forms2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="javascript:alert('test')"></form>
    swimming:<input type="checkbox" name="swimming" value="swimming"><br>
    reading:<input type="checkbox" name="reading" value="reading"><br>

<hr>
    gender:<input type="radio" name="gender" value="male"><br>
           <input type="radio" name="gender" value="female"><br>


<input type="submit" value="Login">


</body>
</html>

在同级目录下创建py文件

from selenium import webdriver
from time import sleep
import os

class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        path = os.path.dirname(os.path.abspath(__file__))
        file_path = 'file:///'+path+'/forms2.html'
        self.driver.get(file_path)

    def test_checkbox(self):
        swimming = self.driver.find_element_by_name('swimming')
        if not swimming.is_selected():    # 判断是否选中
            swimming.click()
        reading = self.driver.find_element_by_name('reading')
        if not reading.is_selected():
            reading.click()
        sleep(3)
        swimming.click()
        sleep(3)

        self.driver.quit()

    def test_radio(self):
        lst = self.driver.find_elements_by_name('gender')
        lst[1].click()

if __name__ == '__main__':
    case = TestCase()
    # case.test_checkbox()
    case.test_radio()

操作下拉列表

需要用到select工具类,其常用方法如下:


image.png

先创建forms3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="javascript:alert('test')">
    provide:
    <select name="provise" id="provise">
        <option value="bj">Beijing</option>
        <option value="tj">Tianjin</option>
        <option value="sh">Shanghai</option>
    </select>
</form>

</body>
</html>

创建测试文件

from selenium import webdriver
from time import sleep
import os

from selenium.webdriver.support.select import Select


class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        path = os.path.dirname(os.path.abspath(__file__))
        file_path = 'file:///'+path+'/form3.html'
        self.driver.get(file_path)

    def test_select(self):
        se = self.driver.find_element_by_id('provise')
        select = Select(se)       # 实例化Select工具类
        select.select_by_index(2)    # 根据索引选择
        sleep(2)
        select.select_by_value('bj')    # 根据值选择
        sleep(2)
        select.select_by_visible_text('Tianjin')    # 根据文本选择
        sleep(2)

        for i in range(3):         # 依次全选
            select.select_by_index(i)
            sleep(1)
        sleep(3)
        for option in select.options:  
            print(option.text)
        self.driver.quit()



if __name__ == '__main__':
    case = TestCase()
    case.test_select()

selenium处理弹窗

弹窗有三种

  • alert: 用来提示
  • confirm:用来确认
  • prompt:输入内容


    image.png

    创建test_alert.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<a href="javascript:alert('提示框')" id="alert">Alert</a><br>
<a href="javascript:confirm('真的要删除数据吗')" id="confirm">Confirm</a><br>
<a href="javascript:var age = prompt('请输入年龄');document.write(age)" id="prompt">Prompt</a><br>
</body>
</html>

再创建测试文件

from selenium import webdriver
from time import sleep
import os

class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        path = os.path.dirname(os.path.abspath(__file__))
        file_path = 'file:///'+path+'/test_alert.html'
        self.driver.get(file_path)

    def test_alert(self):
        self.driver.find_element_by_id('alert').click()
        # 切换到alert
        alert = self.driver.switch_to_alert()
        print(alert.text)
        sleep(3)
        alert.accept()

    def test_confirm(self):
        self.driver.find_element_by_id('confirm').click()
        confirm = self.driver.switch_to_alert()
        print(confirm.text)
        # confirm.accept()
        sleep(2)
        confirm.dismiss()

    def test_prompt(self):
        self.driver.find_element_by_id('prompt').click()
        prompt = self.driver.switch_to_alert()
        print(prompt.text)
        sleep(1)
        prompt.send_keys('20')
        sleep(2)
        prompt.accept()
        self.driver.find_elements_by_id()

if __name__ == '__main__':
    case = TestCase()
    # case.test_alert()
    # case.test_confirm()
    case.test_prompt()

selenium三种等待方式

  1. time.sleep 固定等待最不建议,会导致自动化时间无限延长
  2. implicitly_wait 隐式等待:通过设定的时长等待页面元素加载完成,再执行下面的代码,如果超过设定时间还未加载完成,则继续执行下面的代码(注意:在设定时间内加载完成则立即执行下面的代码),隐式等待对于整个driver周期都起作用,只需要在最开始设置一次即可
  3. WebDriverWait 显示等待:等待某个条件成立时继续执行,WebDriverWait 中的参数如下,他还有两种方法until与until_not


    参数
    方法中的参数

    举个例子

from selenium import webdriver
from time import sleep

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class Testcase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://www.baidu.com')
        # sleep(2)


    def test_sleep(self):
        self.driver.find_element_by_id('kw').send_keys('selenium')
        sleep(2)  # 线程阻塞
        self.driver.find_element_by_id('su').click()
        sleep(3)
        self.driver.quit()

    def test_implicitly(self):
        self.driver.implicitly_wait(10)
        self.driver.find_element_by_id('kw').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        self.driver.quit()

    def test_wait(self):
        wait = WebDriverWait(self.driver,2)
        wait.until(EC.title_is('百度一下,你就知道'))
        self.driver.find_element_by_id('kw').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        self.driver.quit()


if __name__ == '__main__':
    case = Testcase()
    case.test_implicitly()

selenium等待条件

image.png

举个例子,先创建test_wait.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<!--    timeout-->
</head>
<body>
<script>
    function f() {
        window.setTimeout("populate()",2000);
    }
    function populate(){
        document.f1.t1.value = "populated";
        document.getElementById("id1").innerHTML = "<div id='id2'>id 2</div>"
    }
</script>
<form name="f1">
    <input type="text" name="t1">
    <input type="button" value="Click me" onclick="f()" id="btn">
    <div id="id1">
    </div>
</form>

</body>
</html>

同级目录下创建py文件

from selenium import webdriver
from time import sleep
import os

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

'''
test_wait.html这个html是有一个按键和文本框,按下按键两秒后文本框出现内容
'''

class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        file_path = 'file:///'+os.path.abspath('test_wait.html')
        self.driver.get(file_path)

    def test(self):
        self.driver.find_element_by_id('btn').click()
        # 显式等待
        wait = WebDriverWait(self.driver,3)   # 这里等待时间从3改为1会返回超时的异常
        wait.until(EC.text_to_be_present_in_element((By.ID,'id2'),'id 2'))
        self.driver.find_element_by_id('id2').text
        print('ok')


if __name__ == '__main__':
    case = TestCase()
    case.test()

鼠标键盘事件

selenium中的鼠标和键盘事件被封装在ActionChains类中,正确的使用方法是:ActionChains(driver).click(btn).perform()


image.png
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys


class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()

    def test_mouse(self):
        self.driver.get('http://sahitest.com/demo/clicks.htm')
        btn = self.driver.find_element_by_xpath('/html/body/form/input[2]')
        ActionChains(self.driver).double_click(btn).perform()
        sleep(2)
        btn2 = self.driver.find_element_by_xpath('/html/body/form/input[3]')
        ActionChains(self.driver).click(btn2).perform()
        sleep(2)
        btn3 = self.driver.find_element_by_xpath('/html/body/form/input[4]')
        ActionChains(self.driver).context_click(btn3).perform()


    def test_key(self):
        self.driver.get('http://www.baidu.com')
        # kw = self.driver.find_element_by_id('kw')
        # kw.send_keys('selenium')
        # kw.send_keys(Keys.CONTROL,'a')
        # sleep(2)
        # kw.send_keys(Keys.CONTROL,'x')
        # sleep(2)
        # kw.send_keys(Keys.CONTROL,'v')
        # sleep(2)
        e = self.driver.find_element_by_link_text('新闻')
        ActionChains(self.driver).move_to_element(e).perform()
        sleep(2)


if __name__ == '__main__':
    case = TestCase()
    # case.test_mouse()
    case.test_key()

selenium执行javascript脚本

  • execute_script同步执行
  • execute_asunc异步执行
from selenium import webdriver
from time import sleep


class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('http://www.baidu.com')

    def test1(self):
        self.driver.execute_script("alert('test')")
        sleep(2)
        self.driver.switch_to.alert.accept()

    def test2(self):
        js = 'return document.title'
        title = self.driver.execute_script(js)
        print(title)

    def test3(self):
        js = 'var q = document.getElementById("kw"); q.style.border="2px solid red"'
        self.driver.execute_script(js)

    def test4(self):
        self.driver.find_element_by_id('kw').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        sleep(2)
        js = 'window.scrollTo(0, document.body.scrollHeight)'   # 将滚动滚到底
        self.driver.execute_script(js)
        sleep(2)


if __name__ == '__main__':
    case = TestCase()
    case.test4()

selenium屏幕截屏

from selenium import webdriver
from time import sleep, strftime, localtime, time
import os


class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('http://www.baidu.com')

    def test1(self):
        self.driver.find_element_by_id('kw').send_keys('selenium')
        self.driver.find_element_by_id('su').click()

        sleep(2)
        st = strftime("%Y-%m-%d-%H-%M-%S", localtime(time()))
        fime_name = st + '.png'

        path = os.path.abspath('screenshot')
        file_name = path+'/'+fime_name
        self.driver.get_screenshot_as_file(file_name)


if __name__ == '__main__':
    case = TestCase()
    case.test1()

selenium定位frame iframe

frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。


image.png
from selenium import webdriver
from time import sleep


class TestCase():
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://sahitest.com/demo/framesTest.htm')

    def test1(self):
        top = self.driver.find_element_by_name('top')
        self.driver.switch_to_frame(top)    # 切换frame
        self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td[1]/a[1]').click()
        self.driver.switch_to.default_content()   # 返回主frame
        sleep(3)
        second = self.driver.find_element_by_xpath('/html/frameset/frame[2]')
        self.driver.switch_to.frame(second)
        self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td[1]/a[2]').click()
        sleep(3)
        self.driver.quit()


if __name__ == '__main__':
    case = TestCase()
    case.test1()

相关文章

网友评论

      本文标题:selenium入门

      本文链接:https://www.haomeiwen.com/subject/uuvtxrtx.html