1、获取name属性进行测试
a. Java版
1 package eight_position; 2 3 //导入WebDriver所需的 4 import org.openqa.selenium.By; 5 import org.openqa.selenium.WebDriver; 6 import org.openqa.selenium.firefox.FirefoxDriver; 7 8 public class eightposition { 9 public static void main(String args[]) throws InterruptedException { 10 System.setProperty("webdriver.gecko.driver","D:\BrowserDriver\geckodriver.exe"); 11 12 WebDriver driver = new FirefoxDriver(); 13 driver.manage().window().maximize(); 14 driver.get("https://www.baidu.com/"); 15 driver.findElement(By.name("wd")).sendKeys("12345"); 16 Thread.sleep(3000); 17 driver.findElement(By.id("su")).click(); 18 Thread.sleep(3000); 19 driver.quit(); 20 } 21 }
b. Python版
1 # 引入selenium包 2 from selenium import webdriver 3 4 # 启动浏览器,创建一个webdriver对象wd,传递参数浏览器驱动,这里字符串前的 r 用于告诉计算机这是个原始字符串,不需要转义 5 wd = webdriver.Chrome(r'D:Browserchromedriver.exe') 6 7 # 操作对象打开某网站 8 wd.get('http://www.baidu.com') 9 10 # 依据id选择元素,返回的就是该元素对应的webElement对象 11 element = wd.find_element_by_id('kw') 12 13 # 在获取的输入栏中输入字符(这里可以直接在字符串结尾添加 换行 转义字符,相当于回车查询,就不需要再一次查找按钮元素的位置,触发点击事件) 14 # 即以下三句可以合并为: element.send_keys('墨小澄 ') 15 element.send_keys('墨小澄') 16 element=wd.find_element_by_id('su') 17 element.click() 18 pass
2、By.id():获取id属性
a. Java版
b. Python版
1 # 引入selenium包 2 from selenium import webdriver 3 4 # 启动浏览器,创建一个webdriver对象wd,传递参数浏览器驱动,这里字符串前的 r 用于告诉计算机这是个原始字符串,不需要转义 5 wd = webdriver.Chrome(r'D:Browserchromedriver.exe') 6 7 # 操作对象打开某网站 8 wd.get('http://www.baidu.com') 9 10 # 依据id选择元素,返回的就是该元素对应的webElement对象 11 element = wd.find_element_by_id('kw') 12 13 # 在获取的输入栏中输入字符(这里可以直接在字符串结尾添加 换行 转义字符,相当于回车查询,就不需要再一次查找按钮元素的位置,触发点击事件) 14 # 即以下三句可以合并为: element.send_keys('墨小澄 ') 15 element.send_keys('墨小澄') 16 element=wd.find_element_by_id('su') 17 element.click() 18 pass
3、获取class属性值
a. Java(暂定)
b. Python
2 wd = webdriver.Chrome(r'D:BrowserDriverchromedriver.exe') 3 wd.get('http://scd1.python3.vip/files/selenium/sample.html') 4 5 # 依据 class name选择元素,返回的是一个列表 6 # 列表里都是 class属性值为animal的元素对应的webElement对象 7 # find_element_by_class_name: 获取class属性 8 element = wd.find_elements_by_class_name('animal)
9 for element in elements: 10 print(element.text)
【Tips】这里element后面加了 s 。
wd.find_elements_by_class_name('animal')
当一个元素有多个class属性值时,只需要选择其中一个即可,不可全部写入其中。
区别:
* find_elements:返回的是找到的是符合条件的所有元素,放在一个列表中返回,如果没有符合条件的元素,就返回空列表;
* find_element:只返回第一个元素。没有符合条件的,会抛出 NoSuchElementException 异常。
4、依据tag名选择元素(tag: 网页开发中的所有标签)
a. JAVA(暂定)
b. Python
1 from selenium import webdriver 2 wd = webdriver.Chrome(r'D:BrowserDriverchromedriver.exe') 3 wd.get('http://cdn1.python3.vip/files/selenium/sample1.html') 4 # 获取网页中的div标签 5 elements=wd.find_elements_by_tag_name('div') 6 for element in elements: 7 print(element.text)
5、通过WebElement对象选择元素
a. JAVA(暂定)
b. python
WebElement兑现也可以调用find_elements_by_xxx,find_element_by_xxx之类的方法。
区别: * WebDriver对象 选择元素的范围是 整个页面;
* WebElement对象 选择元素的范围是 该元素的内部
1 from selenium import webdriver 2 wd=webdriver.Chrome(r'D:BrowserDriverchromedriver.exe') 3 wd.get('http://cdn1.python3.vip/files/selenium/sample1.html') 4 element=wd.find_element_by_id('container') 5 # 限制 选择元素的范围是 id为 container 元素的内部 6 spans=element.find_elements_by_tag_name('span') 7 for span in spans: 8 print(span.text)
6、等待界面元素出现(Python)
当我们进行网页操作时,有的元素会延迟加载。例如百度浏览器搜索某个东西,点击搜索后,浏览器发送搜索请求给服务器,服务器处理后返回结果,这段传输需要一定时间,百度服务器处理比较快,因为其搜索的结果对应的界面元素的id为数字1,2……
我们直接脚本控制搜索可能会报NoSuchElementException异常,原因是脚本执行速度比服务器响应要快,没有收到服务器返回的结果。此时需要等待再打印选中元素的值
1 from selenium import webdriver 2 wd=webdriver.Chrome(r'D:BrowserDriverchromedriver.exe') 3 wd.get('http://www.baidu.com') 4 element=wd.find_element_by_id('kw') 5 element.send_keys('12306 ') 6 # 需要导入时间包 7 from time import sleep 8 sleep(2) 9 element=wd.find_elemnet_by_id('1') 10 print(element.text)
——》总结:1、selenium找不到元素的原因:
a. 页面加载过慢——可加载页面等待时间;
i. 时间设为显示等待:针对某个特定的元素设置的等待时间,规定h时间内,没找到元素,抛异常,
b. 查到的元素没有在当前的框架中——需要切换至对应的框架中;
c. 元素错误;
=》 2、selenium(python)等待时间:
1. sleep(second) —— 强制等待,封装在time中的sleep类中;
1 from selenium import webdriver 2 wd=webdriver.Chrome(r'D:BrowserDriverchromedriver.exe') 3 wd.get('http://www.baidu.com') 4 element=wd.find_element_by_id('kw') 5 element.send_keys('12306 ') 6 from time import sleep 7 sleep(2) 8 element=wd.find_element_by_id('1') 9 print(element.text)
2. WebDriverWait(driver,timeout,poll_frequency,ignored_exceptions)——显示等待,当找到要娇艳的元素后就继续执行下面的程序,非强制等待;
* driver 浏览器驱动;
* timeout 最长超时,秒为单位;
* poll_frequency 检测间隔(步长)时间,默认0.5s;
* ignored_frequency 超时后的异常信息,默认情况下抛出NoSuchEleosumentException;
* webDriverWait 一般和until()和until_not()方法配合使用;
1 from selenium import webdriver 2 from time import sleep 3 # 从selenium.webdriver.common.by导入By包进行元素定位 4 # By是selenium中内置的一个class,在这个class中有各种方法定位元素 5 ''' 6 By所支持的定位器的分类: 7 -classname属性定位: 8 CLASS_NAME='class name' =》find_element(By.CLASS_NAME,"claname") 9 -css选择器定位: 10 CSS_SELECTOR='css selector' => find_element(By.CSS_SELECTOR,"#id") 11 -id属性定位: 12 ID='id' => find_element(By.ID,"id") 13 -a标签文本属性定位: 14 LINK_TEXT='link text' => find_element(By.LINK_TEXT,"text") 15 -name属性定位: 16 NAME='name' => find_element(By.NAME,"name") 17 -a标签部分文本属性定位 18 PARTIAL_LINK_TEXT='partial link text' => find_element(By.PARTIAL_LINK_TEXT,"partailtext") 19 -标签名定位: 20 TAG_NAME='tag name' => find_element(By.TAG_NAME,"input") 21 -xpath路径定位: 22 XPATH='xpath' => find_element(By.XPATH,"//div[$name='name']") 23 主要应用于一个过滤器,webdriver的方法是一个定位器 24 25 expected_conditions as EC中的方法: 26 title_is: 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值 27 title_contains : 判断当前页面的title是否包含预期字符串,返回布尔值 28 presence_of_element_located : 判断某个元素是否被加到了dom树里,并不代表该元素一定可见 29 visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0 30 visibility_of : 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了 31 presence_of_all_elements_located : 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是‘column-md-3‘,那么只要有1个元素存在,这个方法就返回True 32 text_to_be_present_in_element : 判断某个元素中的text是否 包含 了预期的字符串 33 text_to_be_present_in_element_value : 判断某个元素中的value属性是否 包含 了预期的字符串 34 frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False 35 invisibility_of_element_located : 判断某个元素中是否不存在于dom树或不可见 36 element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable 37 staleness_of : 等某个元素从dom树中移除,注意,这个方法也是返回True或False 38 element_to_be_selected : 判断某个元素是否被选中了,一般用在下拉列表 39 element_selection_state_to_be : 判断某个元素的选中状态是否符合预期 40 element_located_selection_state_to_be : 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator 41 alert_is_present : 判断页面上是否存在alert 42 ''' 43 from selenium.webdriver.common.by import By 44 from selenium.webdriver.support.ui import WebDriverWait 45 from selenium.webdriver.support import expected_conditions as EC 46 # WebDriverWait 显示等待 47 driver = webdriver.Chrome(r'D:BrowserDriverchromedriver.exe') 48 driver.get("http://www.baidu.com") 49 el = driver.find_element_by_xpath('//*[@id="kw"]') 50 element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw"))) 51 element.send_keys('selenium') 52 driver.find_element_by_xpath('//*[@id="su"]').click() 53 sleep(5) 54 driver.quit()
3. implicicitly(second)——隐式等待,设置最长等待时长,若在特定时间内未找到元素则抛出NoSuchEleosumentException异常;
1 # 隐式等待 2 from selenium import webdriver 3 from time import sleep,ctime 4 from selenium.common.exceptions import NoSuchElementException 5 driver=webdriver.Chrome(r'D:BrowserDriverchromedriver.exe') 6 driver.implicitly_wait(10) 7 driver.get('http://www.baidu.com/') 8 try: 9 print(ctime()) 10 driver.find_element_by_xpath('//*[@id="kw"]').send_keys("selenium") 11 driver.find_element_by_xpath('//*[@id="su"]').click() 12 except NoSuchElementException as E: 13 print(E) 14 finally: 15 print(ctime()) 16 driver.quit()
【Tips】隐式等待会等driver完全加载完成,显示等待仅仅校验需要加载的元素是否存在。