2021-04-19 18:16发布
1.id定位: find_element_by_id() 从上面定位到的搜索框属性中,有个...
2.name定位: find_element_by_name() 从上面定位到的搜索框属性中...
3.class定位:find_element_by_class_name() 从上面定位到的...
4.tag定位:find_element_by_tag_name() 如果懂HTML知识...
5.link定位:find_element_by_link_text() 此种方法是专门用来..
6、partial_link定位:find_element_by_partial_link_text()
有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
7、xpath定位:find_element_by_xpath()
8、CSS定位:find_element_by_css_selector()
这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,这里只做下简单的介绍。
适用下述1,2的网页HTML代码如下:
1、使用ID定位
WebElement element = driver.findElement(By.id("username"));
由于页面元素的id是唯一的,所以用id来定位一个元素,可保证其唯一性。
2、使用name定位
WebElement element = driver.findElement(By.name("username"));
由于页面元素的name属性不是唯一的,所有通过name定位可能同时定位到多个元素。
3、使用Class名称定位
WebElement element = driver.findElement(By.className("submitBut"));
此方法根据页面元素的class属性来定位。
4、使用链接的全部内容定位
WebElement element = driver.findElement(By.linkText("sougou 搜索"));
此方法的链接文字必须精确匹配到“sougou 搜索”,否则无法找到链接。
5、使用链接的部分内容定位
(1)WebElement element = driver.findElement(By.partialLinkText("搜索"));
(2)Listelement = driver.findElements(By.partialLinkText("搜索"));
此方法的链接文字只需模糊匹配到“搜索”即可,
(1)定位到的元素是页面第一个满足条件的元素,只有一个;
(2)定位到页面所有满足条件的元素,结果是个集合。
6、使用标签名定位
(1)WebElement element = driver.findElement(By.tagName("a"));
(2)List element = driver.findElements(By.tagName("a"));
此方法根据标签的名称匹配
(1)定位到页面第一个匹配到的a标签;
(2)定位到页面所有匹配到的a标签。
7、使用XPath定位 XPath定位功能比较强大,XPath是在XML文档树中的某个节点既可以向前搜索定位,也可以向后搜索定位。
8、使用CSS定位 css定位和xpath定位很类似,只是定位速度比xpath更快,更稳定。
9、jQuery定位 jQuery定位其实就是使用jQuery库的查找功能,主要应用于使用css不能很好定位的浏览器。
10、表格的定位方法
上面的7,8,9,10定位方法,会拎出来分别单独详细说明。
用谷歌浏览器打开百度首页,点击右上角>更多工具>开发者工具,就可以看到整个页面的html代码了
点击框中左上角的箭头图标,移动鼠标到百度搜索框,就可以自动定位到百度搜索框的HTML代码了,查看到搜索框的属性,我们可以看到搜索框有id,name,class等属性。
1、id定位: find_element_by_id()
从上面定位到的搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框
代码:
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过id定位搜索框,并输入seleniumdriver.find_element_by_id('kw').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
2、name定位: find_element_by_name()
从上面定位到的搜索框属性中,有个name="wd"的属性,我们可以通过这个name定位到这个搜索框
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过name定位搜索框,并输入seleniumdriver.find_element_by_name('wd').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
3、class定位:find_element_by_class_name()
从上面定位到的搜索框属性中,有个class="s_ipt"的属性,我们可以通过这个class定位到这个搜索框
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过class定位搜索框,并输入seleniumdriver.find_element_by_class_name('s_ipt').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
4、tag定位:find_element_by_tag_name()
如果懂HTML知识,我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等...。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多div,input,a等tag,所以很难通过tag去区分不同的元素。基本上在我们工作中用不到这种定义方法,仅了解就行。下面代码仅做参考,运行时必定报错
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过tag定位搜索框,并输入selenium, 此处必报错driver.find_element_by_tag_name('input').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
5、link定位:find_element_by_link_text()
此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“hao123”,“地图”等链接
我们来定位“新闻”这个链接元素
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过link定位"新闻"这个链接并点击driver.find_element_by_link_text('新闻').click()# 等待5秒sleep(5)# 退出driver.quit()
我们用这种方法来定位百度首页的“新闻”超链接
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过partial_link定位"新闻"这个链接并点击driver.find_element_by_partial_link_text('闻').click()# 等待5秒sleep(5)# 退出driver.quit()
前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。
但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了。
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过xpath定位搜索框,并输入seleniumdriver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
CSS定位百度搜索框
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过CSS定位搜索框,并输入seleniumdriver.find_element_by_css_selector('#kw').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
用他的selenium的webdriverd的API,可以是css path定位,也可是xpath定位,还可以根据ID定位等等
更多追问追答
追问
但是class名字都是相同的,xpath写出的都定位不到。例如:"//div[@id='mainmenutree']/ul/li/ul/li[2]/a"
追答
不可能啊,按照你上面写的这个应该能定位到用这个方法find_element_by_xpath("your xpath") 你可以在浏览器中,对着想要的元素点击右键,获取XPATH
selenium框架中的元素定位
一、在学习如何对selenium框架中的页面元素进行定位前,先来了解一下什么是selenium。
Selenium,是一个开源的框架,主要用于做HTML页面的UI自动化测试。它支持多平台,多浏览器,多语言去实现自动化测试。框架图如下所示:
seleniumIDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。
seleniumGrid是一种自动化的测试辅助工具,利用它可以很方便地实现在多台机器上和异构环境中运行测试用例。
seleniumRC是selenium家族的核心,它支持多种不同语言编写的自动化测试脚本,通过seleniumRC的服务器作为代理服务器去访问应用,从而达到测试的目的。
seleniumRC分为Client Libraries和selenium Server。Client Libraries库主要用于编写测试脚本,用来控制selenium Server的库。selenium Server负载控制浏览器行为,总的来说,selenium Server主要包括三个部分:Launcher、Http Proxy和Core。其中Core是被selenium Server嵌入到浏览器页面中的,其实Core就是一堆javaScript函数的集合,即通过这些javaScript函数,我们才可以实现用程序对浏览器的操作。Launcher用于启动浏览器,把Core加载到浏览器页面当中,并把浏览器的代理设置为Http Proxy.
Selenium2.0=Selenium1.0+WebDriver
WebDriver可以看作是seleniumRC的替代品,它与浏览器紧密集成,因此支持创建更高级的测试。
这里我主要用WebDriver来定位页面元素。
WebDriver提供了一系列的对象定位方法,常见的的有以下8种:
1.driver.find_ element by name0一最常用, 简单
2.driver.find_ element by id0一最常用 .简单
3.driver.find element. by. class name( )
4.driver.find_ element. by_ tag_ name()最不靠谱
5.driver.find_ element by. link text()定位文字连接好用
6.driver.find element. by partial. link text)–定位文字连接好用
7.driver.find element. Hy xpath0-最灵活 ,万能
8.driver.find element. by_ css selector()–效率高、 万能
这里我以百度首页为例,为大家来演示在Pycharm中如何编写利用WebDriver定位页面元素自动化代码。
1.id定位
定位搜索条,定位到搜索条的id:
from selenium import webdriver # 导入webdriver
import pyautogui # 导入坐标定位类
import time # 导入时间模块,为了看清脚本步骤,需要加休眠时间
driver = webdriver.Chrome() # 打开浏览器,赋值给一个变量
driver.get(“http://www.baidu.com”) # get方法获取资源
driver.maximize_window() # 窗口最大化
time.sleep(2) # 强制休眠,为看下面的输入内容
driver.find_element_by_link_text(‘新闻’).click() # 点击文字链接
driver.find_element_by_id(“kw”).send_keys(‘Python程序’) # 输入内容,send_keys()方法为添加输入的内容
和上面同样的方法,定位百度一下的id
driver.find_element_by_id(“su”).click() # 点击搜索按钮,click()方法为提交功能和submit()方法一样。
driver.quit() # 退出相关驱动程序,并关闭所有窗口
driver.close() # 关闭当前一个窗口
2.坐标定位
此处的坐标值是我以我电脑屏幕左上角为基准,qq截屏截的。
import time
driver = webdriver.Chrome()
driver.get(‘http://www.baidu.com’)
driver.maximize_window()
time.sleep(1)
driver.find_element_by_id(“kw”).send_keys(‘Python程序设计’)
time.sleep(3)
pyautogui.moveTo(721, 146, duration=2) # 实现坐标定位,duration持续时间
pyautogui.click() # 点击百度一下
pyautogui.moveTo(1360, 210, duration=2) #
pyautogui.scroll(-5000) # scroll()滚动鼠标
pyautogui.moveTo(665, 666, duration=2)
pyautogui.scroll(5000)
3.文字链接
driver.find_element_by_link_text(‘新闻’).click() # 点击文字链接,点击百度首页左上角的新闻链接
4.所有的页面元素都是在页面通过检查,来定位元素,不论是用以上8种方法中的哪一种。
from selenium import webdriver
import pyautogui
定位文字链接,可以模糊查询
driver.find_element_by_partial_link_text(‘31省区市’).click(’//*[@id=“kw”]’)
driver.close()
xpath定位:绝对路径定位
driver.find_element_by_xpath(r’html/body/div/div/div[5]/div[1]/div[1]/form/span/input’).send_keys(‘新冠’)
相对路径://表示当前页面的某个目录,input表示标签名,在页面复制的xpath是//*[@id=“kw”],在所有标签中查出,效率不是很高
driver.find_element_by_xpath(r’//input[@id=“kw”]’).send_keys(‘新冠’)
driver.find_element_by_xpath(’//input[@id=“su”]’).click()
使用class,name定位
driver.find_element_by_xpath(r’//input[@name=“wd”]’).send_keys(‘class’)
driver.find_element_by_xpath(r’//input[@class=“btn self-btn bg s_btn”]’).click()
层次与属性的结合,假如没有可利用属性值,我们可以查找上一级属性。
通过父元素去查找
driver.find_element_by_xpath(r’//form[@id=“form”]/span/input’).send_keys(‘父元素’)
driver.find_element_by_xpath(r’//form[@id=“form”]/span[2]/input’).click()
使用逻辑运算符,定位更准确
driver.find_element_by_xpath(r’//form[@id=“form” and @name=“f”]/span/input[@id=“kw” and @name=“wd”]’).send_keys(‘逻辑运算符’)
css的效果高于xpath
css定位:class属性定位:.=class
driver.find_element_by_css_selector(’.s_ipt’).send_keys(‘经济内循环2020’)
使用id属性定位:#=id
driver.find_element_by_css_selector(’#su’).click()
通过标签名:寻找input标签,不准确,只做了解,一个页面input标签有多个
driver.find_element_by_css_selector(“input”).click()
通过父子关系定位
span>input,父元素为span,子元素为input的所有标签
driver.find_element_by_css_selector(“span>input”).send_keys(‘python程序设计’)
通过属性定位
driver.find_element_by_css_selector(’[name=“wd”]’).send_keys(‘我很丑可是我很温柔’)
driver.find_element_by_css_selector(’[type=“submit”]’).click()
组合定位
driver.find_element_by_css_selector(‘form.fm>span>input.s_ipt’).send_keys(‘python程序设计’)
driver.find_element_by_css_selector(‘form#form>span>input#kw’).send_keys(‘java程序设计’)
time.sleep(2)
driver.find_element_by_css_selector(‘span>input#su’).click()
5.by定位元素
driver.find_element(By.ID, “kw”).send_keys()
driver.find_element(By.NAME, ‘wd’)
设置浏览器大写(控制浏览器的大小)
driver.set_window_size(400, 800)
浏览器前进和后退:
url2 = ‘http://news.baidu.com’
#driver.find_element_by_link_text(‘新闻’).click()
driver.get(url2)
time.sleep(10)
#返回百度首页
driver.back()
#前进到新闻页面
driver.forward()
#刷新当前页面(类似于F5)
driver.refresh()
获取输入框的尺寸
s = driver.find_element_by_id(“kw”).size
print(s)
返回百度底部的备案信息
s1 = driver.find_element_by_xpath(’//*[@id=“s-bottom-layer-right”/a/span]’).text
print(s1)
text = driver.find_element_by_id(“virus-2020”).text
print(text)
#返回元素的属性值,可以是id,name,type或者其他属性
#get_attribute(name):获取元素的属性值
a = driver.find_element_by_id(‘kw’).get_attribute(‘name’)
print(a)
#is_dispplayed:设置元素是否为用户可见
b = driver.find_element_by_id(‘kw’).is_displayed()
print(b)
以上代码包含了这8种定位页面元素的方法,其实不难,要熟练记住这些方法,还得多敲多练习。
主要用WebDriver来定位页面元素。
如果懂HTML知识,我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等...。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多div,input,a等tag,所以很难通过tag去区分不同的元素。
换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...
十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...
前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...
迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...
python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写
第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...
head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...
挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了
Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...
相当于 ... 这里不是注释
还有FIXME
python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。
单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:# 单行注释print(hello world)注释可以放在代码上面也可以放在代...
主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...
或许是里面有没被注释的代码
自学的话要看个人情况,可以先在B站找一下视频看一下
最多设置5个标签!
1.id定位: find_element_by_id() 从上面定位到的搜索框属性中,有个...
2.name定位: find_element_by_name() 从上面定位到的搜索框属性中...
3.class定位:find_element_by_class_name() 从上面定位到的...
4.tag定位:find_element_by_tag_name() 如果懂HTML知识...
5.link定位:find_element_by_link_text() 此种方法是专门用来..
6、partial_link定位:find_element_by_partial_link_text()
有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
7、xpath定位:find_element_by_xpath()
8、CSS定位:find_element_by_css_selector()
这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,这里只做下简单的介绍。
适用下述1,2的网页HTML代码如下:
1、使用ID定位
WebElement element = driver.findElement(By.id("username"));
由于页面元素的id是唯一的,所以用id来定位一个元素,可保证其唯一性。
2、使用name定位
WebElement element = driver.findElement(By.name("username"));
由于页面元素的name属性不是唯一的,所有通过name定位可能同时定位到多个元素。
3、使用Class名称定位
WebElement element = driver.findElement(By.className("submitBut"));
此方法根据页面元素的class属性来定位。
4、使用链接的全部内容定位
WebElement element = driver.findElement(By.linkText("sougou 搜索"));
此方法的链接文字必须精确匹配到“sougou 搜索”,否则无法找到链接。
5、使用链接的部分内容定位
(1)WebElement element = driver.findElement(By.partialLinkText("搜索"));
(2)Listelement = driver.findElements(By.partialLinkText("搜索"));
此方法的链接文字只需模糊匹配到“搜索”即可,
(1)定位到的元素是页面第一个满足条件的元素,只有一个;
(2)定位到页面所有满足条件的元素,结果是个集合。
6、使用标签名定位
(1)WebElement element = driver.findElement(By.tagName("a"));
(2)List element = driver.findElements(By.tagName("a"));
此方法根据标签的名称匹配
(1)定位到页面第一个匹配到的a标签;
(2)定位到页面所有匹配到的a标签。
7、使用XPath定位 XPath定位功能比较强大,XPath是在XML文档树中的某个节点既可以向前搜索定位,也可以向后搜索定位。
8、使用CSS定位 css定位和xpath定位很类似,只是定位速度比xpath更快,更稳定。
9、jQuery定位 jQuery定位其实就是使用jQuery库的查找功能,主要应用于使用css不能很好定位的浏览器。
10、表格的定位方法
上面的7,8,9,10定位方法,会拎出来分别单独详细说明。
一、查看页面元素
用谷歌浏览器打开百度首页,点击右上角>更多工具>开发者工具,就可以看到整个页面的html代码了
点击框中左上角的箭头图标,移动鼠标到百度搜索框,就可以自动定位到百度搜索框的HTML代码了,查看到搜索框的属性,我们可以看到搜索框有id,name,class等属性。
二、元素定位
1、id定位: find_element_by_id()
从上面定位到的搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框
代码:
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过id定位搜索框,并输入seleniumdriver.find_element_by_id('kw').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
2、name定位: find_element_by_name()
从上面定位到的搜索框属性中,有个name="wd"的属性,我们可以通过这个name定位到这个搜索框
代码:
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过name定位搜索框,并输入seleniumdriver.find_element_by_name('wd').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
3、class定位:find_element_by_class_name()
从上面定位到的搜索框属性中,有个class="s_ipt"的属性,我们可以通过这个class定位到这个搜索框
代码:
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过class定位搜索框,并输入seleniumdriver.find_element_by_class_name('s_ipt').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
4、tag定位:find_element_by_tag_name()
如果懂HTML知识,我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等...。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多div,input,a等tag,所以很难通过tag去区分不同的元素。基本上在我们工作中用不到这种定义方法,仅了解就行。下面代码仅做参考,运行时必定报错
代码:
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过tag定位搜索框,并输入selenium, 此处必报错driver.find_element_by_tag_name('input').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
5、link定位:find_element_by_link_text()
此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“hao123”,“地图”等链接
我们来定位“新闻”这个链接元素
代码:
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过link定位"新闻"这个链接并点击driver.find_element_by_link_text('新闻').click()# 等待5秒sleep(5)# 退出driver.quit()
6、partial_link定位:find_element_by_partial_link_text()
有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
我们用这种方法来定位百度首页的“新闻”超链接
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过partial_link定位"新闻"这个链接并点击driver.find_element_by_partial_link_text('闻').click()# 等待5秒sleep(5)# 退出driver.quit()
7、xpath定位:find_element_by_xpath()
前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。
但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了。
代码:
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过xpath定位搜索框,并输入seleniumdriver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
8、CSS定位:find_element_by_css_selector()
这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,这里只做下简单的介绍。
CSS定位百度搜索框
# coding = utf-8from time import sleepfrom selenium import webdriver# 驱动文件路径driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页driver.get(r'https://www.baidu.com/')# 通过CSS定位搜索框,并输入seleniumdriver.find_element_by_css_selector('#kw').send_keys('selenium')# 等待5秒sleep(5)# 退出driver.quit()
用他的selenium的webdriverd的API,可以是css path定位,也可是xpath定位,还可以根据ID定位等等
更多追问追答
追问
追答
selenium框架中的元素定位
一、在学习如何对selenium框架中的页面元素进行定位前,先来了解一下什么是selenium。
Selenium,是一个开源的框架,主要用于做HTML页面的UI自动化测试。它支持多平台,多浏览器,多语言去实现自动化测试。框架图如下所示:
seleniumIDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。
seleniumGrid是一种自动化的测试辅助工具,利用它可以很方便地实现在多台机器上和异构环境中运行测试用例。
seleniumRC是selenium家族的核心,它支持多种不同语言编写的自动化测试脚本,通过seleniumRC的服务器作为代理服务器去访问应用,从而达到测试的目的。
seleniumRC分为Client Libraries和selenium Server。Client Libraries库主要用于编写测试脚本,用来控制selenium Server的库。selenium Server负载控制浏览器行为,总的来说,selenium Server主要包括三个部分:Launcher、Http Proxy和Core。其中Core是被selenium Server嵌入到浏览器页面中的,其实Core就是一堆javaScript函数的集合,即通过这些javaScript函数,我们才可以实现用程序对浏览器的操作。Launcher用于启动浏览器,把Core加载到浏览器页面当中,并把浏览器的代理设置为Http Proxy.
Selenium2.0=Selenium1.0+WebDriver
WebDriver可以看作是seleniumRC的替代品,它与浏览器紧密集成,因此支持创建更高级的测试。
这里我主要用WebDriver来定位页面元素。
WebDriver提供了一系列的对象定位方法,常见的的有以下8种:
1.driver.find_ element by name0一最常用, 简单
2.driver.find_ element by id0一最常用 .简单
3.driver.find element. by. class name( )
4.driver.find_ element. by_ tag_ name()最不靠谱
5.driver.find_ element by. link text()定位文字连接好用
6.driver.find element. by partial. link text)–定位文字连接好用
7.driver.find element. Hy xpath0-最灵活 ,万能
8.driver.find element. by_ css selector()–效率高、 万能
这里我以百度首页为例,为大家来演示在Pycharm中如何编写利用WebDriver定位页面元素自动化代码。
1.id定位
定位搜索条,定位到搜索条的id:
from selenium import webdriver # 导入webdriver
import pyautogui # 导入坐标定位类
import time # 导入时间模块,为了看清脚本步骤,需要加休眠时间
driver = webdriver.Chrome() # 打开浏览器,赋值给一个变量
driver.get(“http://www.baidu.com”) # get方法获取资源
driver.maximize_window() # 窗口最大化
time.sleep(2) # 强制休眠,为看下面的输入内容
driver.find_element_by_link_text(‘新闻’).click() # 点击文字链接
driver.find_element_by_id(“kw”).send_keys(‘Python程序’) # 输入内容,send_keys()方法为添加输入的内容
和上面同样的方法,定位百度一下的id
driver.find_element_by_id(“su”).click() # 点击搜索按钮,click()方法为提交功能和submit()方法一样。
driver.quit() # 退出相关驱动程序,并关闭所有窗口
driver.close() # 关闭当前一个窗口
2.坐标定位
此处的坐标值是我以我电脑屏幕左上角为基准,qq截屏截的。
from selenium import webdriver # 导入webdriver
import pyautogui # 导入坐标定位类
import time
driver = webdriver.Chrome()
driver.get(‘http://www.baidu.com’)
driver.maximize_window()
time.sleep(1)
driver.find_element_by_id(“kw”).send_keys(‘Python程序设计’)
time.sleep(3)
pyautogui.moveTo(721, 146, duration=2) # 实现坐标定位,duration持续时间
pyautogui.click() # 点击百度一下
pyautogui.moveTo(1360, 210, duration=2) #
pyautogui.scroll(-5000) # scroll()滚动鼠标
pyautogui.moveTo(665, 666, duration=2)
pyautogui.scroll(5000)
3.文字链接
driver.find_element_by_link_text(‘新闻’).click() # 点击文字链接,点击百度首页左上角的新闻链接
4.所有的页面元素都是在页面通过检查,来定位元素,不论是用以上8种方法中的哪一种。
from selenium import webdriver
import pyautogui
import time
driver = webdriver.Chrome() # 打开浏览器,赋值给一个变量
driver.get(“http://www.baidu.com”) # get方法获取资源
driver.maximize_window() # 窗口最大化
time.sleep(2) # 强制休眠,为看下面的输入内容
定位文字链接,可以模糊查询
driver.find_element_by_partial_link_text(‘31省区市’).click(’//*[@id=“kw”]’)
driver.close()
xpath定位:绝对路径定位
driver.find_element_by_xpath(r’html/body/div/div/div[5]/div[1]/div[1]/form/span/input’).send_keys(‘新冠’)
相对路径://表示当前页面的某个目录,input表示标签名,在页面复制的xpath是//*[@id=“kw”],在所有标签中查出,效率不是很高
driver.find_element_by_xpath(r’//input[@id=“kw”]’).send_keys(‘新冠’)
driver.find_element_by_xpath(’//input[@id=“su”]’).click()
使用class,name定位
driver.find_element_by_xpath(r’//input[@name=“wd”]’).send_keys(‘class’)
driver.find_element_by_xpath(r’//input[@class=“btn self-btn bg s_btn”]’).click()
层次与属性的结合,假如没有可利用属性值,我们可以查找上一级属性。
通过父元素去查找
driver.find_element_by_xpath(r’//form[@id=“form”]/span/input’).send_keys(‘父元素’)
driver.find_element_by_xpath(r’//form[@id=“form”]/span[2]/input’).click()
使用逻辑运算符,定位更准确
driver.find_element_by_xpath(r’//form[@id=“form” and @name=“f”]/span/input[@id=“kw” and @name=“wd”]’).send_keys(‘逻辑运算符’)
css的效果高于xpath
css定位:class属性定位:.=class
driver.find_element_by_css_selector(’.s_ipt’).send_keys(‘经济内循环2020’)
time.sleep(1)
使用id属性定位:#=id
driver.find_element_by_css_selector(’#su’).click()
通过标签名:寻找input标签,不准确,只做了解,一个页面input标签有多个
driver.find_element_by_css_selector(“input”).click()
通过父子关系定位
span>input,父元素为span,子元素为input的所有标签
driver.find_element_by_css_selector(“span>input”).send_keys(‘python程序设计’)
通过属性定位
driver.find_element_by_css_selector(’[name=“wd”]’).send_keys(‘我很丑可是我很温柔’)
driver.find_element_by_css_selector(’[type=“submit”]’).click()
组合定位
driver.find_element_by_css_selector(‘form.fm>span>input.s_ipt’).send_keys(‘python程序设计’)
driver.find_element_by_css_selector(‘form#form>span>input#kw’).send_keys(‘java程序设计’)
time.sleep(2)
driver.find_element_by_css_selector(‘span>input#su’).click()
5.by定位元素
driver.find_element(By.ID, “kw”).send_keys()
driver.find_element(By.NAME, ‘wd’)
设置浏览器大写(控制浏览器的大小)
driver.set_window_size(400, 800)
time.sleep(2)
浏览器前进和后退:
url2 = ‘http://news.baidu.com’
#driver.find_element_by_link_text(‘新闻’).click()
driver.get(url2)
time.sleep(10)
#返回百度首页
driver.back()
time.sleep(10)
#前进到新闻页面
driver.forward()
#刷新当前页面(类似于F5)
driver.refresh()
获取输入框的尺寸
s = driver.find_element_by_id(“kw”).size
print(s)
返回百度底部的备案信息
s1 = driver.find_element_by_xpath(’//*[@id=“s-bottom-layer-right”/a/span]’).text
print(s1)
text = driver.find_element_by_id(“virus-2020”).text
print(text)
#返回元素的属性值,可以是id,name,type或者其他属性
#get_attribute(name):获取元素的属性值
a = driver.find_element_by_id(‘kw’).get_attribute(‘name’)
print(a)
#is_dispplayed:设置元素是否为用户可见
b = driver.find_element_by_id(‘kw’).is_displayed()
print(b)
以上代码包含了这8种定位页面元素的方法,其实不难,要熟练记住这些方法,还得多敲多练习。
主要用WebDriver来定位页面元素。
WebDriver提供了一系列的对象定位方法,常见的的有以下8种:
1.driver.find_ element by name0一最常用, 简单
2.driver.find_ element by id0一最常用 .简单
3.driver.find element. by. class name( )
4.driver.find_ element. by_ tag_ name()最不靠谱
5.driver.find_ element by. link text()定位文字连接好用
6.driver.find element. by partial. link text)–定位文字连接好用
7.driver.find element. Hy xpath0-最灵活 ,万能
8.driver.find element. by_ css selector()–效率高、 万能
1、id定位: find_element_by_id()
从上面定位到的搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框
代码:
2、name定位: find_element_by_name()
从上面定位到的搜索框属性中,有个name="wd"的属性,我们可以通过这个name定位到这个搜索框
代码:
3、class定位:find_element_by_class_name()
从上面定位到的搜索框属性中,有个class="s_ipt"的属性,我们可以通过这个class定位到这个搜索框
代码:
4、tag定位:find_element_by_tag_name()
如果懂HTML知识,我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等...。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多div,input,a等tag,所以很难通过tag去区分不同的元素。
相关问题推荐
换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...
十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...
前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...
迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...
python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写
第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...
head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...
挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了
Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...
相当于 ... 这里不是注释
还有FIXME
python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。
单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:# 单行注释print(hello world)注释可以放在代码上面也可以放在代...
主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...
或许是里面有没被注释的代码
自学的话要看个人情况,可以先在B站找一下视频看一下