Selenium元素定位实战

一、Selenium简述

Selenium是一个用于web应用程序的自动化测试工具。

Selenium直接运行在浏览器中,它可以模拟用户的行为操作。

Selenium支持IE、Google Chrome、Firefox、Opera等主流浏览器。

Selenium也支持主流开发语言,如Java、Python、C#等。

二、Selenium结合浏览器实战

针对不同浏览器,需要下载的驱动程序不同。

以Firefox浏览器为例,

下载解压后,把geckodriver.exe文件放在Python安装程序的目录下。

很容易出现驱动程序(Driver)版本与Firefox浏览器不兼容的情况。

目前我能成功的环境为:

驱动:geckodriver-v0.24.0-win64.zip   浏览器:v58.0  

针对Firefox浏览器测试代码如下:

from selenium import webdriver
driver=webdriver.Firefox()
driver.get('http://www.baidu.com/')
driver.find_element_by_id('lst-ib').send_keys('Selenium')
driver.quit()

结果:

三、单个元素定位实战 

在Selenium自动化测试中,提供了单元素定位方式和多元素定位方式。

这里以百度搜索框的输入框为例:

1、find_element_by_id(通过元素id定位到元素)

from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('selenium')
driver.quit()

2、find_element_by_name(通过元素属性name定位到元素)

from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_name('wd').send_keys('selenium')
driver.quit()

3、find_element_by_class_name(通过元素属性class_name定位到元素)

from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_class_name('s_ipt').send_keys('selenium')
driver.quit()

4、find_element_by_xpath(通过元素属性xpath定位到元素)

from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('selenium')
driver.quit()

5、find_element_by_link_text(link_text对于超链接的处理)

from selenium import webdriver
driver=webdriver.Firefox()
driver.get('http://www.baidu.com')
driver.find_element_by_link_text(u'新闻').click()
driver.quit()

6、find_element_by_partial_link_text(partial_link_text也对于超链接的处理,与link_text不同的是,它是按模糊搜索方式处理的)

from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_partial_link_text(u'新闻').click()
driver.quit()

7、find_element_by_css_selector(当使用id、name等方式定位不到元素的时候,可以使用css_selector)

from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_css_selector('#kw').send_keys('Selenium')
driver.quit()

四、多个元素定位实战 

在工作中,某些时候可能会发现元素的ID、NAME、CLASS_NAME等元素属性是一致的,这时,使用ID、NAME、CLASS_NAME等这些元素属性定位就无法准确地定位到具体的元素。

1、find_elements_by_tag_name

from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
tag_names=driver.find_elements_by_tag_name('input')
for tag_name in tag_names:
	print(tag_name)
print(type(tag_names))
driver.quit()

结果:

2、find_elements_by_id

index.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="success.html" method="post">
    <center>
        <p>用户名:<input type="text" id="login" name="username"></p>
        <p>密 码:<input type="text" id="login" name="password"></p>
        <p><input type="submit" id="login" value="登录"></p>
    </center>
</form>
</body>
</html>

Python代码:

from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/PythonProjects/MyTestingProjects/index.html')
ids=driver.find_element_by_id('login')
#输入用户名
ids[0].send_keys('wuya')
#输入密码
ids[1].send_keys('admin')
#点击“登录”按钮
ids[2].click()
driver.quit()

 效果:

四、By类的分析

五、iframe元素定位实战

在自动化测试中,如果无法定位到一个元素,那么最大的可能是定位的元素属性在iframe框架中。

1、处理未嵌套的iframe

frame.html如下: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <center>
        <a href="frame-1.html" target="10">Yansky课堂</a>
        <a href="frame-2.html" target="10">Python接口测试实战</a><br><br>
    </center>
    <iframe id="text" src="frame-1.html" name="10-20" width="500" height="170" align="center">
    </iframe>
</body>
</html>

 frame-1.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
     <center>
         <font size="5">Yansky课堂</font><br><br>
     </center>
     Yansky课堂已经上线,欢迎大家关注!
</body>
</html>

frame-2.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <center>
        <font size="5">Python接口测试实战</font> <br><br>
    </center>
    基于Python的接口自动化测试实战课程
</body>
</html>

结果报错:

依据给出的错误信息可以发现这个错误是元素定位错误导致的。由于存在iframe框架,首先需要进入到iframe框架,再定位iframe框架中的元素。定位的方式有两种,一种是以ID定位,一种是以索引的方式。

①以ID的方式定位时的实现代码:

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

driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/PythonProjects/MyTestingProjects/frame.html')
#依据iframe的Id进入frame框架
driver.switch_to_frame('text')
#获取"Yansky课堂"文本信息
print(driver.find_element_by_xpath('/html/body/center/font').text)
driver.quit()

②以索引的方式进入到iframe框架中:

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

driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/PythonProjects/MyTestingProjects/frame.html')
#根据索引进入frame框架
driver.switch_to_frame(0)
#获取"Yansky课堂"文本信息
print(driver.find_element_by_xpath('/html/body/center/font').text)
driver.quit()

2、处理嵌套的iframe

下面来看看嵌套的iframe在自动化测试中如何进行元素定位,以及如何跳出嵌套。

在一个页面中嵌套一个Bing搜索页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html" charset="UTF-8"/>
    <title>嵌套页面</title>
</head>
<body>
    <iframe id="son" src="http://www.bing.com" width="800" height="400">
    </iframe>
</body>
</html>

在该页面中要实现Bing的搜索框效果,首先要进入到iframe框架中,然后定位Bing首页搜索输入框的元素属性。

实现在Bing首页搜索输入框中输入关键字代码如下:

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

driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/PythonProjects/MyTestingProjects/frame.html')
#根据索引进入frame框架
driver.switch_to_frame('son')
#输入搜索关键字Selenium
driver.find_element_by_id('sb_form_q').send_keys('Selenium')
driver.quit()

 下面是一个多层级的嵌套页面在自动化中的应用案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html" charset="UTF-8"/>
    <title>多层嵌套</title>
</head>
<body>
<center>
    <iframe id="parent" src="bing.html" width="1000" height="300">
    </iframe>
</center>
<hr>
<center>
    请输入用户名:<input type="text" id="userid" name="username" class="classname">
</center>
</body>
</html>

要想在Bing首页搜索输入框中输入搜索关键字Selenium,然后在下面的用户名输入框中输入Selenium,实现代码如下:

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

driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(60)
driver.get('file:///F:/PythonProjects/MyTestingProjects/second.html')
#根据id进入到第一层frame框架中
driver.switch_to_frame('parent')
#根据id进入到第二层frame框架中
driver.switch_to_frame('son')
#输入搜索关键字Selenium
driver.find_element_by_id('sb_form_q').send_keys('Selenium')
#跳出frame框架
driver.switch_to_default_content()
#用户名输入框中输入Selenium
driver.find_element_by_name('username').send_keys('Selenium')
driver.quit()
发布了66 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Yansky58685/article/details/103717047