webdriver+webelement模块

Selenium库底层源码学习

webdriver模块

在做UI自动化测试时,我们必须对浏览器进行操作。因此需要先创建的webdriver对象。

from selenium import webdriver
# 创建webdriver对象
driver = webdriver.Chrome()

webdriver对象的属性和方法的使用(常用顺序从上到下)

使用说明备注
driver.get('https://www.baidu.com') 在当前浏览器会话中加载固定url的web页面  
driver.find_element_by_xpath("//*[@id="kw"]") 通过xpath表达式定位  
driver.find_element_by_css_selector("#kw") 通过css选择器进行定位  
js = "document.getElementById('su').value='百度两下'" driver.execute_script(js) 在浏览器中同步执行JavaScript  
driver.close() 关闭当前窗口(标签页)  
driver.quit() 关闭浏览器,包括所有页面  
driver.back() 浏览器后退  
driver.forward() 浏览器前进  
driver.refresh() 浏览器刷新  
driver.implicitly_wait(30) 隐式等待,是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步 隐性等待对整个driver的周期都起作用,所以只要设置一次即可
driver.save_screenshot(f"{int(time.time())}.png") save_screenshot 调用的还是 get_screenshot_as_file方法  
driver.get_window_rect() 获取当前窗口的x、y坐标以及的高度和宽度, return {'height': 1020, 'width': 945, 'x': 10, 'y': 10}  
driver.current_url 获取当前页面的URL  
driver.title 返回当前页的标题title  
driver.name 返回此实例的底层浏览器的名称  
driver.capabilities 获取浏览器的属性值  
driver.find_element_by_id("kw") 通过元素id定位  
driver.find_element_by_name("wd") 通过元素name定位  
driver.find_element_by_class_name("s_ipt") 通过类名进行定位  
driver.find_element_by_link_text("新闻") 通过完整超链接定位  
driver.find_element_by_partial_link_text("hao").click() 通过部分链接定位  
driver.find_element_by_tag_name("input") 通过标签定位  
driver.execute_async_script(js) 在浏览器中异步执行JavaScript,当前在使用过程中还未涉及到异步概念,延后处理  
driver.page_source 获取当前页面源码,通常配合爬虫使用  
driver.current_window_handle 返回当前窗口的句柄  
driver.window_handles 返回当前会话中所有窗口的句柄;打开多个页面时使用该方法,返回全部句柄  
driver.maximize_window() 最大化webdriver正在使用的当前窗口  
driver.fullscreen_window() 调用特定于窗口管理器的“全屏”操作,相当于F11全屏浏览器  
driver.minimize_window() 调用特定于窗口管理器的“最小化”操作,将浏览器最小化到任务栏  
driver.switch_to 返回一个对象,其中包含可将焦点切换到的所有选项  
driver.switch_to.active_element 定位到当前聚焦的元素上,返回了一个元素  
driver.switch_to.alert 切换到alert弹窗  
driver.switch_to.default_content() 切换到主页面;当切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档  
driver.switch_to.frame('frame_name') driver.switch_to.frame(1) driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0]) 通过id、name、element(定位的某个元素)、索引来切换到某个frame  
driver.switch_to.parent_frame() 是switch_to中独有方法,可以切换到上一层的frame,对于层层嵌套的frame很有用  
driver.switch_to.new_window() driver.get("http://www.4399.com") 打开一个新页面,使浏览器中存在多个标签页  
driver.switch_to.window(handle) 切换到指定的window_name页签,要切换到的窗口句柄  
driver.get_cookies() 返回当前浏览器中的cookies(所有的)  
driver.get_cookie(name) 返回当前浏览器中的cookie(指定name的)  
driver.delete_cookie(name) 删除具有给定名称的单个cookie  
driver.delete_all_cookies() 删除会话范围内的所有cookie  
driver.add_cookie(cookie_dict="") 在当前会话中添加一个cookie  
driver.set_page_load_timeout(30) 设置页面加载超时  
driver.set_script_timeout(30) 设置页面异步js执行超时  
driver.find_element(By.ID, 'foo') 根据策略和定位器找到给定的(唯一)元素By.ID/By.TAG_NAME/By.NAME...  
driver.find_elements(By.ID, 'foo') 返回列表,包含多个元素对象  
driver.desired_capabilities 返回当前正在使用的驱动程序所需的功能属性值  
driver.get_screenshot_as_file(f"{int(time.time())}.png") 保存当前窗口的截图到一个PNG图像文件,filename应以.png结尾  
driver.get_screenshot_as_png() 以二进制数据的形式获取当前窗口的屏幕截图。\x89PNG\r\n\x1a\n\x00  
driver.get_screenshot_as_base64() 以base64编码的字符串的形式获取当前窗口的屏幕截图,方便在HTML中的嵌入图像使用  
driver.set_window_size(800, 600) 设置浏览器窗体大小,宽度*高度  
driver.get_window_size() 获取当前窗口的宽度和高度, return {'width': 945, 'height': 1020}  
driver.set_window_position(500, 500) 设置当前窗口的x,y位置  
driver.get_window_position() 获取当前窗口的x、y位置, return {'x': 10, 'y': 10}  
driver.set_window_rect(x=500,y=500,width=800,height=600) 设置当前窗口的x、y坐标以及的高度和宽度  

代码如下,若上面能满足您的要求,则直接跳过。

from selenium import webdriver

# 创建webdriver对象
driver = webdriver.Chrome()
# 在当前浏览器会话中加载固定url的web页面,
driver.get('https://www.baidu.com')
# 返回当前页的标题title
title = driver.title

# 返回此实例的底层浏览器的名称
name = driver.name
# print(name)

# 获取webdriver模块中方法值
# print(dir(driver))

# 获取浏览器的属性值
# print(driver.capabilities)

# """
# 在当前页面中寻找元素(唯一元素)
# driver.find_element_by_id("kw")
# driver.find_element_by_name("wd")
# driver.find_element_by_class_name("s_ipt")
# driver.find_element_by_xpath("//*[@id="kw"]")
# driver.find_element_by_css_selector("#kw")
# driver.find_element_by_link_text("新闻")
# driver.find_element_by_partial_link_text("hao").click()
# driver.find_element_by_tag_name("input")
# 以上查找元素方法中用的最多是xpath & css_selector,个人喜好使用css_selector.

# 在浏览器中同步执行JavaScript
# 将百度页面中‘百度一下’按钮文字更改为‘百度两下’
js = "document.getElementById('su').value='百度两下'"
driver.execute_script(js)

# 在浏览器中异步执行JavaScript,当前在使用过程中还未涉及到异步概念,延后处理
# driver.execute_async_script(js)

# 获取当前页面的URL
print(driver.current_url)

# 获取当前页面源码,通常配合爬虫使用。
# print(driver.page_source)

# 关闭当前窗口(标签页)
# driver.close()

# 退出驱动程序并关闭所有相关窗口(关闭浏览器,包括所有页面)
# driver.quit()

# 返回当前窗口的句柄
# handle = driver.current_window_handle

# 返回当前会话中所有窗口的句柄;打开多个页面时使用该方法,返回全部句柄
# print(driver.window_handles)

# 最大化webdriver正在使用的当前窗口
# driver.maximize_window()

# 调用特定于窗口管理器的“全屏”操作,相当于F11全屏浏览器
# driver.fullscreen_window()
time.sleep(2)

# 调用特定于窗口管理器的“最小化”操作,将浏览器最小化到任务栏
# driver.minimize_window()

# driver.switch_to 返回一个对象,其中包含可将焦点切换到的所有选项:
"""
  #.active_element 定位到当前聚焦的元素上,返回了一个元素
  element = driver.switch_to.active_element
   
  #.alert 切换到alert弹窗
  alert = driver.switch_to.alert
   
  # .default_content() 切换到主页面;当切到frame中之后,不能继续操作主文档的元素,若想操作主文档内容,则需切回主文档
  driver.switch_to.default_content()
   
  # 通过id、name、element(定位的某个元素)、索引来切换到某个frame
  driver.switch_to.frame('frame_name')
  driver.switch_to.frame(1)
  driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
   
  # .parent_frame() 是switch_to中独有方法,可以切换到上一层的frame,对于层层嵌套的frame很有用
  driver.switch_to.parent_frame()
   
  # .new_window() 打开一个新页面,使浏览器中存在多个标签页
  driver.switch_to.new_window()
  driver.get("http://www.4399.com")
   
  # .window() 切换到指定的window_name页签,要切换到的窗口句柄
  driver.switch_to.window(handle)
"""

# 浏览器后退
# driver.back()

# 浏览器前进
# driver.forward()

# 浏览器刷新
# driver.refresh()

# 返回当前浏览器中的cookies(所有的)
# driver.get_cookies()

# 返回当前浏览器中的cookie(指定name的)
# driver.get_cookie(name)

# 删除具有给定名称的单个cookie
# driver.delete_cookie(name)

# 删除会话范围内的所有cookie
# driver.delete_all_cookies()

# 在当前会话中添加一个cookie
# driver.add_cookie(cookie_dict="")

# 隐式等待,是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步
# 隐性等待对整个driver的周期都起作用,所以只要设置一次即可
# driver.implicitly_wait(30)

# 设置页面加载超时
# driver.set_page_load_timeout(30)

# 设置页面异步js执行超时
# driver.set_script_timeout(30)

# 根据策略和定位器找到给定的(唯一)元素By.ID/By.TAG_NAME/By.NAME...
# driver.find_element(By.ID, 'foo')

# 返回列表,包含多个元素对象
# driver.find_elements(By.ID, 'foo')

# 返回当前正在使用的驱动程序所需的功能属性值
# temp = driver.desired_capabilities

# 保存当前窗口的截图到一个PNG图像文件,filename应以.png结尾;save_screenshot 调用的还是 get_screenshot_as_file方法
# driver.get_screenshot_as_file(f"{int(time.time())}.png")
# driver.save_screenshot(f"{int(time.time())}.png")

# 以二进制数据的形式获取当前窗口的屏幕截图。\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x0...
# temp = driver.get_screenshot_as_png()
# 以base64编码的字符串的形式获取当前窗口的屏幕截图,方便在HTML中的嵌入图像使用;iVBORw0KGgoAAAANSUhEUgAAB4AAAAOdCAYAAABkpX+Q...
# temp = driver.get_screenshot_as_base64()

# 设置浏览器窗体大小,宽度*高度,窗口句柄名称
# driver.set_window_size(800, 600)

# 获取当前窗口的宽度和高度, return {'width': 945, 'height': 1020}
# temp = driver.get_window_size()

# 设置当前窗口的x,y位置
# driver.set_window_position(500, 500)

# 获取当前窗口的x、y位置, return {'x': 10, 'y': 10}
# temp = driver.get_window_position()

# 获取当前窗口的x、y坐标以及的高度和宽度, return {'height': 1020, 'width': 945, 'x': 10, 'y': 10}
# temp = driver.get_window_rect()

# 设置当前窗口的x、y坐标以及的高度和宽度
# driver.set_window_rect(x=500,y=500,width=800,height=600)

webElement模块

webdriver对象相当于浏览器。在自动化测试中除了浏览器操作外,我们还需实现UI元素的操作。而操作元素前必须先定位到元素(webelement)才能进行操作。

selenium元素定位的方法有八种:

定位一个元素定位多个元素含义
find_element_by_id find_elements_by_id 通过元素id定位
find_element_by_name find_elements_by_name 通过元素name定位
find_element_by_xpath find_elements_by_xpath 通过xpath表达式定位
find_element_by_link_text find_elements_by_link_tex 通过完整超链接定位
find_element_by_partial_link_text find_elements_by_partial_link_text 通过部分链接定位
find_element_by_tag_name find_elements_by_tag_name 通过标签定位
find_element_by_class_name find_elements_by_class_name 通过类名进行定位
find_elements_by_css_selector find_elements_by_css_selector 通过css选择器进行定位
# 在当前页面中寻找元素(唯一元素),elements是定位元素集(非唯一元素)
driver.find_element_by_id("kw")
driver.find_element_by_name("wd")
driver.find_element_by_class_name("s_ipt")
driver.find_element_by_xpath("//*[@id="kw"]")
driver.find_element_by_css_selector("#kw")
driver.find_element_by_link_text("新闻")
driver.find_element_by_partial_link_text("hao")
driver.find_element_by_tag_name("input")
# 以上查找元素方法中用的最多是xpath & css_selector,个人喜好使用css_selector.

使用css_selector的方法说明:

通过css定位,id使用#,class使用.,级别向下使用>,:nth-child(1)。

driver.find_element_by_css_selector("#kw")
driver.find_element_by_css_selector("[title='搜索']")
driver.find_element_by_css_selector(".s_ipt")
driver.find_element_by_css_selector("html > body > form > span > input")
driver.find_element_by_css_selector("span.soutu-btn > input#kw")
driver.find_element_by_css_selector("p:nth-child(1)")
选择器示例示例说明
.class .intro 选择所有class="intro"的元素
#id #firstname 选择所有id="firstname"的元素
* * 选择所有元素
element p 选择所有<p>元素
element,element div,p 选择所有<div>元素和<p>元素
element element div p 选择<div>元素内的所有<p>元素
element>element div>p 选择所有父级是 <div> 元素的 <p> 元素
element+element div+p 选择所有紧接着<div>元素之后的<p>元素
[attribute] [target] 选择所有带有target属性元素
[attribute=value] [target=-blank] 选择所有使用target="-blank"的元素
[attribute~=value] [title~=flower] 选择标题属性包含单词"flower"的所有元素
[attribute|=language] [lang|=en] 选择一个lang属性的起始值="EN"的所有元素
:link a:link 选择所有未访问链接
:visited a:visited 选择所有访问过的链接
:active a:active 选择活动链接
:hover a:hover 选择鼠标在链接上面时
:focus input:focus 选择具有焦点的输入元素
:first-letter p:first-letter 选择每一个<P>元素的第一个字母
:first-line p:first-line 选择每一个<P>元素的第一行
:first-child p:first-child 指定只有当<p>元素是其父级的第一个子级的样式。
:before p:before 在每个<p>元素之前插入内容
:after p:after 在每个<p>元素之后插入内容
:lang(language) p:lang(it) 选择一个lang属性的起始值="it"的所有<p>元素
element1~element2 p~ul 选择p元素之后的每一个ul元素
[attribute^=value] a[src^="https"] 选择每一个src属性的值以"https"开头的元素
[attribute$=value] a[src$=".pdf"] 选择每一个src属性的值以".pdf"结尾的元素
[attribute**=value*] a[src*="runoob"] 选择每一个src属性的值包含子字符串"runoob"的元素
:first-of-type p:first-of-type 选择每个p元素是其父级的第一个p元素
:last-of-type p:last-of-type 选择每个p元素是其父级的最后一个p元素
:only-of-type p:only-of-type 选择每个p元素是其父级的唯一p元素
:only-child p:only-child 选择每个p元素是其父级的唯一子元素
:nth-child(n) p:nth-child(2) 选择每个p元素是其父级的第二个子元素
:nth-last-child(n) p:nth-last-child(2) 选择每个p元素的是其父级的第二个子元素,从最后一个子项计数
:nth-of-type(n) p:nth-of-type(2) 选择每个p元素是其父级的第二个p元素
:nth-last-of-type(n) p:nth-last-of-type(2) 选择每个p元素的是其父级的第二个p元素,从最后一个子项计数
:last-child p:last-child 选择每个p元素是其父级的最后一个子级。
:root :root 选择文档的根元素
:empty p:empty 选择每个没有任何子级的p元素(包括文本节点)
:target #news:target 选择当前活动的#news元素(包含该锚名称的点击的URL)
:enabled input:enabled 选择每一个已启用的输入元素
:disabled input:disabled 选择每一个禁用的输入元素
:checked input:checked 选择每个选中的输入元素
:not(selector) :not(p) 选择每个并非p元素的元素
::selection ::selection 匹配元素中被用户选中或处于高亮状态的部分
:out-of-range :out-of-range 匹配值在指定区间之外的input元素
:in-range :in-range 匹配值在指定区间之内的input元素
:read-write :read-write 用于匹配可读及可写的元素
:read-only :read-only 用于匹配设置 "readonly"(只读) 属性的元素
:optional :optional 用于匹配可选的输入元素
:required :required 用于匹配设置了 "required" 属性的元素
:valid :valid 用于匹配输入值为合法的元素
:invalid :invalid 用于匹配输入值为非法的元素

使用xpath方法说明

driver.find_element_by_xpath("//*[@id='kw']")
driver.find_element_by_xpath("//*[@name='wd']")
driver.find_element_by_xpath("//input[@class='s_ipt']")
driver.find_element_by_xpath("/html/body/form/span/input")
driver.find_element_by_xpath("//span[@class='soutu-btn']/input")
driver.find_element_by_xpath("//form[@id='form']/span/input")
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']")
选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:

表达式描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]//title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用"|"运算符,您可以选取若干个路径。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

元素定位后的操作

元素定位后,接下来就是元素的操作了,即webelement对象的属性和方法的使用:

ele = driver.find_element_by_id('id')
使用说明备注
ele.tag_name 获取该元素的'tagName'属性,input/div  
ele.text 获取标签内文字 隐藏标签中文字,无法获取;只能获取在页面中显示的元素,标签内的文字内容
ele.send_keys("输入文字") 在文本框内输入文字  
ele.click() 点击操作 1.<input type="button" /> 这就是一个按钮。如果你不写javascript 的话,按下去什么也不会发生。 2.<input type="submit" /> 这样的按钮用户点击之后会自动提交 form,除非你写了javascript 阻止它。 3.<button> 这个按钮放在 form中也会点击自动提交,比前两个的优点是按钮的内容不光可以有文字,还可以有图片等多媒体内容。(当然,前两个用图片背景也可以做到)。它的缺点是不同的浏览器得到的value值不同;可能还有其他的浏览器兼容问题(葛亮)。其他标签,例如 a, img, span, div,然后用图片把它伪装成一个按钮。
ele.submit() 提交操作  
ele.clear() 如果是文本输入元素(文本框内容),则清除文本  
ele.get_property('value') 获取元素的给定属性,标签内的属性 获取元素的给定属性,标签内的属性,二者的区别在于属性不存在时,是否报错
ele.get_property('value1') 属性值不存在就报错  
ele.get_attribute('value') 获取元素的给定属性,标签内的属性  
ele.get_attribute('value1') 属性值不存在返回 None  
ele.is_selected() 当前元素是否被选中,通常在checkbox、radiobox、select option等元素上  
ele.is_enabled() 用于存储input、select等元素的可编辑状态,可以编辑返回true,否则返回false  
ele.is_displayed() 元素对用户是否存在,这里的存在不是肉眼看到的存在,而是html代码的存在。某些情况元素的visibility为hidden或者display属性为none,我们在页面看不到但是实际是存在页面的一些元素  
ele.location_once_scrolled_into_view 返回当前元素的左上角坐标X、Y的位置,即在当前页面中的绝对位置坐标  
ele.size 元素的大小属性,{'height': 44, 'width': 108}  
driver.find_element_by_css_selector('#J_searchbg') 元素的CSS属性的值,在F12中‘Styles’标签下 temp = ele.value_of_css_property('height') temp1 = ele.value_of_css_property('width') temp2 = ele.value_of_css_property('font-family') print(temp, temp1, temp2, sep='\n')
ele.location 页面元素在canvas中的位置,从body左上角开始计算{'x': 678, 'y': 58}  
ele.rect 返回包含元素大小和位置的字典,{'height': 32, 'width': 430, 'x': 678.5, 'y': 58}  
ele.screenshot_as_base64 对元素进行截图,存储为:base64编码的字符串,二进制png流,png图片  
ele.screenshot_as_png    
ele.screenshot(str(time.time()) + '.png')    
temp = ele.parent temp.get('https://www.baidu.com') 找到此元素的WebDriver实例的内部引用(相当于返回了定义的driver对象,可调用webdriver的属性和方法)  
ele.id * selenium使用的内部ID,表示当前元素在selenium中的唯一标识。  

代码如下,若上面能满足您的要求,则直接跳过。

# 获取该元素的'tagName'属性,即标签名
# temp = driver.find_element_by_id("su").tag_name
# 获取标签内文字。隐藏标签中文字,无法获取;只能获取在页面中显示的元素,标签内的文字内容
# temp = driver.find_element_by_css_selector('.soutu-hover-tip').text
# temp = driver.find_element_by_link_text('高考加油').text

# driver.find_element_by_id('kw').send_keys("submit与button的区别")

# ele = driver.find_element_by_id('su')
# 点击操作
# ele.click()
# 提交操作
# ele.submit()
# 二者区别
r'''
<input type="button" /> 这就是一个按钮。如果你不写javascript 的话,按下去什么也不会发生。
<input type="submit" /> 这样的按钮用户点击之后会自动提交 form,除非你写了javascript 阻止它。
<button> 这个按钮放在 form 中也会点击自动提交,比前两个的优点是按钮的内容不光可以有文字,还可以有图片等多媒体内容。
(当然,前两个用图片背景也可以做到)。它的缺点是不同的浏览器得到的 value 值不同;可能还有其他的浏览器兼容问题(葛亮)。
其他标签,例如 a, img, span, div,然后用图片把它伪装成一个按钮。
'''

# 如果是文本输入元素(文本框内容),则清除文本
# ele.clear()

# 获取元素的给定属性,标签内的属性,二者的区别在于属性不存在时,是否报错。
# temp = ele.get_property('value') # 百度一下
# temp = ele.get_property('value1') # 属性值不存在就报错
# temp = ele.get_attribute('value') # 百度一下
# temp = ele.get_attribute('value1') # 属性值不存在返回 None

# 返回元素是否被选中。可用于检查复选框或单选按钮是否被选中

# is_selected # 判断某个元素是否被选中,返回 Bool
# is_enabled # 用于存储input、select等元素的可编辑状态,可以编辑返回true,否则返回false
# is_displayed # 元素对用户是否存在,这里的存在不是肉眼看到的存在,而是html代码的存在。某些情况元素的visibility为hidden或者display属性为none,我们在页面看不到但是实际是存在页面的一些元素
# ele.is_selected()
# ele.is_enabled()
# ele.is_displayed()

# 元素的屏幕坐标(从页面body体中计算{x,y},未计算警告框+浏览器菜单栏的高度)
# temp = ele.location_once_scrolled_into_view
# print(temp)
# time.sleep(2)
# driver.fullscreen_window()
# temp = ele.location_once_scrolled_into_view

# 元素的大小属性,{'height': 44, 'width': 108}
# temp = ele.size

# 元素的CSS属性的值,在F12中‘Styles’标签下
ele = driver.find_element_by_css_selector('#J_searchbg')
# temp = ele.value_of_css_property('height')
# temp1 = ele.value_of_css_property('width')
# temp2 = ele.value_of_css_property('font-family')
# print(temp, temp1, temp2, sep='\n')

# 页面元素在canvas中的位置,从body左上角开始计算{'x': 678, 'y': 58}
# temp = ele.location

# 返回包含元素大小和位置的字典,{'height': 32, 'width': 430, 'x': 678.5, 'y': 58}
# temp = ele.rect

# 对元素进行截图,存储为:base64编码的字符串,二进制png流,png图片
# temp = ele.screenshot_as_base64
# temp1 = ele.screenshot_as_png
# temp2 = ele.screenshot(str(time.time()) + '.png')

# 找到此元素的WebDriver实例的内部引用(相当于返回了定义的driver对象,可调用webdriver的属性和方法)
# temp = ele.parent
# temp.get('https://www.baidu.com')

# * selenium使用的内部ID,没弄明白这个是什么
# temp = ele.id


# temp1 = temp.get_property('value')
# temp2 = temp.get_property('value1')
# temp3 = temp.get_attribute('value')
# temp4 = temp.get_attribute('value1')
# print(type(ele), type(temp), sep='\n')

# driver.close()
# 获取浏览器窗口的当前坐标位置driver.get_window_position()
# temp = driver.get_window_position()
posted @ 2020-08-18 17:02  矢志恒  阅读(481)  评论(0)    收藏  举报