美文网首页
selenium 元素定位

selenium 元素定位

作者: halfempty | 来源:发表于2018-11-06 11:42 被阅读0次
    image.png

    1 测试样本

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>Selenium Test</title>
            <style type="text/css">
                * {margin: 10px}
                form {border:1px red solid}
                span {color: green}
            </style>
            <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
        </head>
        <body>
            <h1 id="my_h1">This is h1 element</h1>
            <p class="my_p" index="first"><a href="https://www.baidu.com" name="baidu_link">Go to <span color="green">baidu</span></a></p>
            <p class="my_p" index="second">The second p</p>
            <p class="my_p" index="third"><input type="file" name="pic" accept="image/gif, image/jpeg"/></p>
            <iframe name="ifm" src="https://www.baidu.com" width="1000px" height="500px"></iframe>
            
            <div class="my_list">
                <ul>
                    <li>python</li>
                    <li>java</li>
                    <li>c++</li>
                </ul>
            </div>
            <form action="#" name="my_form">
                <div><input type="text" name="username" value="input username"/></div>
                <div>
                    <input type="radio" name="sex" value="male" checked />male 
                    <input type="radio" name="sex" value="female" /> female
                </div>
                <div>
                    <select name="addr">
                        <option value="wuhan" checked>wuhan</option>
                        <option value="shanghai">shanghai</option>
                        <option value="beijing">beijing</option>
                        <option value="shenzhen">shenzhen</option>
                    </select>
                </div>
                <div>
                    <input type="checkbox" name="hobby" value="reading" />reading 
                    <input type="checkbox" name="hobby" value="game" />game 
                    <input type="checkbox" name="hobby" value="music" />music 
                </div>
                <div><input type="submit" value="submit"/></div>
            </form>
        </body>
    </html>
    

    2 定位方式

    通过原码可知selenium支持8种元素定位方式

    当然通过调用JS,还可以支持dom和jquery方式定位

    # from selenium.webdriver.common.by import By
    
    class By(object):
        ID = "id"
        XPATH = "xpath"
        LINK_TEXT = "link text"
        PARTIAL_LINK_TEXT = "partial link text"
        NAME = "name"
        TAG_NAME = "tag name"
        CLASS_NAME = "class name"
        CSS_SELECTOR = "css selector"
    

    测试准备:

    • 将样本文件保存为selenium.html

    • http://npm.taobao.org/mirrors/chromedriver/ 下载对应版本的chrome驱动

    • 打开 jupyter 或者其他IDE工具,执行初始化操作

      • from selenium.webdriver import Chrome
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support.select import Select
        
        driver = Chrome(executable_path=r"C:\Users\Administrator\Desktop\chromedriver.exe")
        driver.get("file:///C:/Users/Administrator/Desktop/selenium.html")
        

    2.1 ID定位

    driver.find_element(By.ID, "my_h1").text       # This is h1 element
    driver.find_element_by_id("my_h1").text
    

    2.2 NAME定位

    driver.find_element(By.NAME, "baidu_link").text     # Go to baidu
    driver.find_element_by_name("baidu_link").text
    

    2.3 LINK_TEXT定位

    driver.find_element(By.LINK_TEXT, "Go to baidu")
    driver.find_element_by_link_text("Go to baidu")
    
    driver.find_element(By.PARTIAL_LINK_TEXT, "to baidu")
    driver.find_element_by_partial_link_text("baidu")
    

    2.4 TAG_NAME定位

    driver.find_element(By.TAG_NAME, "a").text         # Go to baidu
    driver.find_element_by_tag_name("a").text
    

    2.5 CLASS_NAME定位

    driver.find_element(By.CLASS_NAME, "my_p").text     # Go to baidu,如何选择第二个my_p元素?
    driver.find_element_by_class_name("my_p").text
    

    2.6 XPATH定位

    # 绝对路径
    driver.find_element(By.XPATH, "/html/body/p[1]").text     # Go to baidu,索引从1开始
    
    # 相对路径
    driver.find_element(By.XPATH, "//p[2]").text              # The second p
    
    # 指定属性(@attribute='value')
    driver.find_element(By.XPATH, "//span[@color='green']").text    # baidu
    
    # last()
    driver.find_element(By.XPATH, "//p[last()]").text         # The second p
    
    # 组合条件
    driver.find_element(By.XPATH, "//p[@class='my_p' and @index='second']").text    # The second p
    

    2.7 CSS定位

    # ID
    driver.find_element(By.CSS_SELECTOR, "#my_h1").text      # This is h1 element
    
    # class
    driver.find_element(By.CSS_SELECTOR, ".my_list >ul >li:nth-child(2)").text    # java
    
    # 指定属性
    driver.find_element(By.CSS_SELECTOR, "input[name='hobby']:last-child").get_attribute("value")  # music
    
    # 伪类
    # :link :hover :active :enabled :disabled :checked :default :valid :invalid :required
    driver.find_elements(By.CSS_SELECTOR, "input[name='hobby']:checked")
    
    # 否定
    driver.find_elements(By.CSS_SELECTOR, "input[name='hobby']:not(:checked)")
    
    # 组合条件
    driver.find_element(By.CSS_SELECTOR, "p[class='my_p'][index='second']").text    # The second p
    
    # 文件上传
    driver.find_element(By.CSS_SELECTOR, "input[name='pic']").send_keys(r'C:\Users\Administrator\Desktop\img.jpg')
    
    # 跳转frame
    # 注意切换了frame,一定要切换回来switch_to.default_content()
    iframe = driver.find_element(By.CSS_SELECTOR, "iframe[name='ifm']")
    driver.switch_to.frame(iframe)
    driver.find_element(By.ID, "kw").send_keys('switch to frame')
    

    2.8 DOM定位

    # getElementById(单数) getElementsByName(复数)getElementsByTagName getElementsByClassName
    # return 关键字不能丢
    driver.execute_script("return document.getElementById('my_h1')").text    # This is h1 element
    
    # 索引从0开始,与上面的xpath,css不同
    driver.execute_script("return document.getElementsByName('sex')[1]").get_attribute("value") # female
    
    # 获取文本内容
    driver.execute_script("return document.getElementsByTagName('p')[0].innerText")  # Go to baidu
    
    # 获取标签属性
    driver.execute_script("return document.getElementsByName('ifm')[0].src")   # https://www.baidu.com/
    
    # 滚动到页面底端
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    

    2.9 JQUERY定位

    # 使用jquery的前提,要求页面加载jquery的js文件
    # 同样要求return 关键字
    # 返回的结果统一为数组,即使使用了类似first的操作
    # jquery操作可以参考 http://jquery.cuishifeng.cn/
    driver.execute_script("return $('ul li:eq(0)')")[0].text     # python
    
    # 表单选择器
    # :input :password :radio :checkbox :button :file
    driver.execute_script("return $(':checkbox:first')")[0].get_attribute("value")   # reading
    

    3 find_element V.S. find_elements

    • find_elements返回列表,如果未发现对象,返回空列表
    • find_element,即使有多个对象,也只返回第一个;如果未发现对象,则抛出异常

    4 select操作

    # 使用Selenium内置的Select对象
    sel = Select(driver.find_element(By.CSS_SELECTOR, "select[name='addr']"))
    sel.select_by_index(1)                    # 注意,索引从0开始
    sel.select_by_value("beijing")
    sel.select_by_visible_text("shenzhen")
    

    5 Radio && Checkbox

    # 使用click方法选择
    driver.find_element(By.CSS_SELECTOR, "input[name='sex'][value='female']").click()
    
    # 模拟space按键
    driver.find_element(By.CSS_SELECTOR, "input[name='sex'][value='male']").send_keys(Keys.SPACE)
    
    # checkbox同理,但有个问题需注意,选择某项的时候,可能是勾选,也有可能是取消,所以需要判断
    driver.find_element(By.CSS_SELECTOR, "input[name='hobby']:nth-child(2)").is_selected()
    
    # 勾选未选择的check
    checks = driver.find_elements(By.CSS_SELECTOR, "input[name='hobby']:not(:checked)")
    for ck in checks:
        ck.click()
    

    相关文章

      网友评论

          本文标题:selenium 元素定位

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