随笔记录selenium WEB元素的四大操作:点击click()、输入send_keys()、获取属性值get_attribute()、获取文本text 和三大窗口切换:Window,iframe,alert

转自:https://blog.csdn.net/saber_sss/article/details/103462745

作为web自动化小白,面对新公司给的自动化代码,显得有点措手不及。先回归一下之前学的元素四大操作和三大窗口切换

selenium元素的四个基本操作:

1、 .click()   #点击
2、 .send_keys() 
#输入操作,在括号里面输入想要输入的任何东西~
3、 WebElement对象.text   
#获取文本信息并返回
4、 WebElement对象.get_attribute(属性名称) 
 #属性值获取

顺便这里说一下其他可能会用到的操作:

5、size=driver.find_element_by_id("kw").size #获取百度输入框的尺寸
print("size:",size)
6、driver.find_element_by_id('kw').submit() #submit相当于回车
7、driver.find_element_by_id('kw').clear() #清除输入框的内容

 

 

selenium页面3大窗口切换:

转自:https://www.cnblogs.com/LCboss/p/11922314.html

selenium中主要是三种窗口

  -Windows窗口
  -iframe窗口
  -alert窗口

1、Windows窗口

  这类窗口也就是我们常说的句柄,句柄的切换是有必要的,我们自己手动在网页上从操作的话,产生新的句柄时浏览器会自动的帮我们跳转到最新的句柄处,
但是我们在做UI自动化的时候,代码并不会帮我们自动的切换到最新的句柄,需要我们使用代码去进行切换:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys


driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element(By.ID, "kw").send_keys("腾讯课堂")
driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)
loc = (By.XPATH, '//div[@id="1"]//h3[@class="t"]//em')
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(loc))
driver.find_element(*loc).click()

以上的代码脚本,就会产生一个新的Windows窗口,如图:

 

 

 

 

我们如果直接去执行下一步操作的话,会报错的,所以我们需要先跳转到新的窗口才行

需要加上以下代码:

windows = driver.window_handles # 获取该会话所有的句柄,注意这里获取到的句柄是一个句柄列表,列表中的句柄元素是按照窗口产生的先后顺序进行添加的,所以最新产生的窗口句柄肯定是在列表最后,所以我们可以用下标-1进行定位跳转
driver.switch_to.window(windows[-1]) # 跳转到最新的句柄
然后我们就可以在这个窗口里面进行新的操作了

 

2、iframe窗口

  iframe窗口是嵌套在我们整个HTML里面的一个HTML的页面,我们如果要对这个iframe中的元素进行操作,那么久必须要先跳转至这个iframe窗口才可以进行该操作,不然就会导致报错:

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


driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element(By.ID, "kw").send_keys("腾讯课堂")
driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)
loc = (By.XPATH, '//div[@id="1"]//h3[@class="t"]//em')
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(loc))
driver.find_element(*loc).click()
windows = driver.window_handles # 获取该会话所有的句柄
driver.switch_to.window(windows[-1]) # 跳转到最新的句柄
first_login = (By.XPATH, '//a[@class="mod-header__link-login js-login-op"]') # 腾讯课堂首页登录按钮
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login)) # 显性等待到登录按钮加载出来,没隔0.5检查一共10秒
# 显性等待首页中的登录按钮是否存在
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login))
# 点击登录按钮
driver.find_element(*first_login).click()
# 显性等待用qq登录是否存在
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(
(By.XPATH,
'//a[@class="js-btns-enter btns-enter btns-enter-qq"]')))
driver.find_element(By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
# 显性等待账号密码登录
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(
(By.XPATH, '//a[@id="switcher_plogin"]')
))
driver.find_element(By.XPATH, '//a[@id="switcher_plogin"]').click()

以上代码,执行的话就会报错,这是因为啥呢?

 

 

 

 

 

所以需要我们在查找此元素之前就要跳转到iframe窗口才可以找到该元素,也就不会报错了,请看以下:

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


driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element(By.ID, "kw").send_keys("腾讯课堂")
driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)
loc = (By.XPATH, '//div[@id="1"]//h3[@class="t"]//em')
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(loc))
driver.find_element(*loc).click()
windows = driver.window_handles # 获取该会话所有的句柄
driver.switch_to.window(windows[-1]) # 跳转到最新的句柄
first_login = (By.XPATH, '//a[@class="mod-header__link-login js-login-op"]') # 腾讯课堂首页登录按钮
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login)) # 显性等待到登录按钮加载出来,没隔0.5检查一共10秒
# 显性等待首页中的登录按钮是否存在
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login))
# 点击登录按钮
driver.find_element(*first_login).click()
# 显性等待用qq登录是否存在
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(
(By.XPATH,
'//a[@class="js-btns-enter btns-enter btns-enter-qq"]')))
driver.find_element(By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
# 跳转到iframe窗口
driver.switch_to.frame('login_frame_qq')
# 显性等待账号密码登录
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(
(By.XPATH, '//a[@id="switcher_plogin"]')
))
driver.find_element(By.XPATH, '//a[@id="switcher_plogin"]').click()

上面红色加粗代码就是我们加上的代码,参数的话可以有多种格式,我这里传递的参数时iframe的name值,有人可能会问:如果这个name值在这个HTML里面有多个name值呢?那我该咋办?

【其实driver.switch_to.frame(value)中这个value值不光可以填写iframe的name值,还可以有以下3种方法:
# driver.switch_to.frame(0) # 1.用frame的index来定位,第一是0
# driver.switch_to.frame("frame1") # 2.用id来定位
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 3.用WebElement对象来定位

在我们对这个iframe操作结束后,我们还是需要回到默认的页面去的,这个时候selenium也给我提供了一步到位的操作

driver.switch_to.default_content()
这行代码就可以回到我们本次会话的最开始的页面

嵌套frame的操作(switch_to.parent_frame())
有时候我们会遇到嵌套的frame,如下:

<html>
  <iframe id="frame1">
    <iframe id="frame2" / >
  </iframe>
</html>

A.从主文档切到frame2,一层层切进去

driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")
B.从frame2再切回frame1,这里selenium给我们提供了一个方法能够从子frame切回到父frame,而不用我们切回主文档再切进来。

driver.switch_to.parent_frame() # 如果当前已是主文档,则无效果
有了parent_frame()这个相当于后退的方法,我们可以随意切换不同的frame,随意的跳来跳去了。

所以只要善用以下三个方法,遇到frame分分钟搞定:

driver.switch_to.frame(reference)
driver.switch_to.parent_frame()
driver.switch_to.default_content()

 

3、alert窗口

  alert窗口就是Windows窗口弹出的提示框,在有这个提示框的作用下,我们是不能做其他的任何操作的,必须要将这个alert弹框给删除掉才可以进行其他操作,如下图:

 

 

selenium中提供了操作

driver.switch_to.alert.send_keys("") # alert弹框输入文本
driver.switch_to.alert.text() # 获取alert的文本内容
driver.switch_to.alert.accept() # 确定操作
driver.switch_to.alert.dismiss() # 取消操作

 

今天主要总结的是三大弹框操作,总结的不到位的欢迎各位进行评论交流哈,,

posted @ 2020-03-27 08:53  吉祥_323  阅读(1490)  评论(0编辑  收藏  举报