一、问题
1、selenium3.0+,谷歌浏览器6.0+,添加了chromedriver.exe运行报错:“不安全:data”等等:
selenium版本和google版本不一致,估计Google版本过高;火狐浏览器暂时没出现此问题,也要下载geckodriver.exe
2、从一个页面跳转到新页面后无法定位到新的元素,或者新页面元素没存入:
到新页面后要在使用之前在原来的driver上进行转换:driver.switch_to_window(driver.window_handles[-1]
“-1”表示最后一个页面,也就是最新的意思,可以根据handles定位到已经打开过的页面
二、实例代码
1、简单打开和输入框输入跳转
from selenium import webdriver
import time
# 打开浏览器url界面
firefox = webdriver.Firefox()
url = 'http://www.jd.com/'
firefox.get(url)
time.sleep(1)
from selenium.webdriver.common.keys import Keys #模拟键盘操作模块
#定位到输入框元素并且自动输入内容,模拟键盘跳转
jd = firefox.find_element_by_id('key')jd.clear()
jd.send_keys("python")
jd.send_keys(Keys.ENTER) # 模拟键盘“Enter”键
2、模拟登录实例+定位新页面元素
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def login(url, keyword):
jdlogin = webdriver.Firefox()
jdlogin.get(url)
time.sleep(1)
# 京东页面登录时分 二维码 和 账户登录 两种,下面这句出发 账户登录 方式
time.sleep(1)
# 输入账户名
jdname = jdlogin.find_element_by_id('loginname')
jdname.clear() #清除输入框中原来的内容
jdname.send_keys("***********")
# 输入密码
jdpwd = jdlogin.find_element_by_id('nloginpwd')
jdpwd.send_keys("**********")
jdpwd.send_keys(Keys.ENTER) # 模拟键盘“Enter”
time.sleep(1)
# 调用下面的函数
get_main_page(jdlogin, keyword)
def get_main_page(firefox, keyword):
firefox.switch_to_window(firefox.window_handles[-1]) #将焦点跳转到当前页面(登陆后的页面)jd = firefox.find_element_by_id('key')
jd.clear() #清除输入框中原来的内容
jd.send_keys(keyword)
jd.send_keys(Keys.ENTER)
url = firefox.current_url # 获取当前页面的url
# 调用下面的函数
get_goods(firefox)
def get_goods(firefox):
firefox.switch_to_window(firefox.window_handles[-1]) #将焦点跳转到当前页面
goods = firefox.find_elements_by_class_name('gl-item')
print(goods)
if __name__ == '__main__': # 主函数
url = 'https://passport.jd.com/uc/login?ltype=logout'
login(url, "python")
3、find_element_by_css_selector用法
driver.find_element_by_css_selector()
css定位可以分为四类:id、class、其他属性、路径。
3.1 #id方式
两种方式,可以在前面加上tag名称,也可以不加
driver.find_element_by_css_selector(‘#id_value’)
driver.find_element_by_css_selector(‘tag_name#id_value’)
3.2 .class方式
两种方式,前面加上tag名称,也可以不加。如果不加tag名称时,点不能省略。
driver.find_element_by_css_selector(‘.class_value’)
driver.find_element_by_css_selector(‘tag_name.class_value’)
如果class还包含其他的tag如<em></em>,<a> </a>时可以直接索引过(‘.class_value em’)
driver.find_element_by_css_selector(‘.class_value em’)
有的class_value比较长,而且中间有空格时,不能把空格原样写进去,那样不能识别。这时,空格用点代替,前面要加上tag_name。
driver.find_element_by_css_selector('div.panel.panel-email').click()
3.3其他属性方式
两种方式,可以在前面加上tag名称,也可以不加。
driver.find_element_by_css_selector(“[attri_name=’attri_value’]”)
driver.find_element_by_css_selector("input[type='password']").send_keys('我要自學網')
driver.find_element_by_css_selector("[type='password']").send_keys('我要自學網')
3.4路径法
两种方式,可以在前面加上tag名称,也可以不加。注意它的层级关系使用大于号“>”。
driver.find_element_by_css_selector("form#loginForm>ul>input[type='password']").send_keys('111222333')