通过 selenium 模块操作浏览器中的一些问题

在编写拾取控件方面与同事 (金建峰) 进行讨论

引用 selenium 模块
* 在引用 selenium 首先需要确认你所需要的使用的浏览器
EX: 使用 Chorme 浏览器
通过 selenium 模块操作浏览器中的一些问题

需要在浏览器 与 python.exe 路径下分别放置 chromedriver.exe(需下载对应浏览器版本的 chromedriver.exe 否则可能造成无法打开浏览器)
基本流程:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
import time

# 设置使用谷歌浏览器打开
driver = webdriver.Chrome()
# 打开百度
driver.get("http://www.baidu.com")
# 找到百度填写的标签id  "kw"
elem = driver.find_element_by_id('kw')
# 输入 python
elem.send_keys("Python")
# 热键ENTER
elem.send_keys(Keys.ENTER)

1. 但在中石化项目中 web 端比较复杂. 当直接拾取标签 id 或这 xpath 过程中可能会报 无法找到标签的错误, 是因为 web 页面中含有 iframe 标签
通过 selenium 模块操作浏览器中的一些问题
所以会造成无法定位的错误, 这时需要优先定位到 iframe 的 id 中

# 先定位到iframe 的id  CRMApplicationFrame
driver.switch_to_frame("CRMApplicationFrame")
# 再定位到frame 的id 
driver.switch_to_frame("WorkAreaFrame1")
# 此时方可定位到 iframe中 你所需要定位的元素标签
ck = driver.find_element_by_id("C13_W42_V43_ZSSFList__header_bee__1")
#点击
ActionChains(driver).click(ck).perform()

2. 对于加载 js 文件中可能产生的延迟而导致的无法找到控件元素, 则可能需要添加延时操作

# 1 .强制等待
time.sleep(3)
# 2.隐式等待
driver.implicitly_wait(10)
# 3.显示等待
try:
    element = WebDriverWait(driver,10,0.5).until(
	EC.text_to_be_present_in_element(
	(By.XPATH,'//xxxxxxxxxxxx'))
	)


隐式等待: 在获取不可用元素之前, 会等待 10 秒, 在 10 秒内如果获取到则直接执行

显示等待: 程序每隔 xx 秒看一眼, 如果条件成立则执行下一步, 否则继续等待, 知道超过设置的最大时长, 然后会抛出异常 TimeoutException