自动化2

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完全加载完成,显示等待仅仅校验需要加载的元素是否存在。

原文地址:https://www.cnblogs.com/Free-Ink/p/12502494.html