Python+selenium学习小结

Selenium是一个Web的自动化测试工具,类型像按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(chrome,Firefox,还包括PhantomJS这些无界面的浏览器)。

Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。 Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。

#导入webdirver

1 from selenium import webdirver

#初始化浏览器,这里需要下载一个浏览器驱动,可以去某宝的镜像站去下载,一定要下载和电脑本身安装的浏览器一致版本的浏览器驱动,将下载的文件可以直接解压放到电脑浏览器的安装路径里面

1 driver = webdriver Chrome()

这是从打开浏览器这一步就自动化运行,但有时候需要手动操作页面到指定页面后再运行脚本,这种情况Google Chrome提供了解决方案,在命令提示符下输入命令:

1 chrome.exe [--headless] --remote-debugging-port=9922 --user-data-dir="D:\selenum\AutomationProfile"

-remote-debugging-port值,可以指定任何打开的端口。
-user-data-dir标记,指定创建新Chrome配置文件的目录。它是为了确保在单独的配置文件中启动chrome,不会污染你的默认配置文件。

命令提示符下运行命令后会弹出浏览器,在浏览器上操作到需要运行脚本的地方就可以让脚本接管浏览器了。

python中接管打开的浏览器,需要先导入Options

1 from selenium.webdriver.chrome.options import Options

接管当前页面

chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9922")
# driver就是当前浏览器窗口
driver = webdriver.Chrome(chrome_options=chrome_options)

接管浏览器后,接着进行页面的操作

Selenium 的 WebDriver提供了各种方法来寻找页面的元素,假设下面有一个表单输入框:

```html
<input type="text" name="user-name" id="passwd-id" />
```

那么:

# 获取id标签值

1 element = driver.find_element_by_id("passwd-id")

# 获取name标签值

1 element = driver.find_element_by_name("user-name")

# 获取标签名值

1 element = driver.find_elements_by_tag_name("input")

# 也可以通过XPath来匹配

1 element = driver.find_element_by_xpath("//input[@id='passwd-id']")

定位UI元素 (WebElements),对元素的选取,Selenium提供了多种API 进行单个元素选取

 

find_element_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

 

在定位元素的过程中,可能经常会报错,像出现:selenium.common.exceptions.NoSuchElementException: Message: Unable to find element with xpath,这个时候就要看看页面源代码,看看所要定位的元素是否在frame或者iframe中,或者代码的等待时间设置有问题,毕竟代码运行和浏览器加载元素不是一个量级的。

如果是有iframe,那么需要切换到iframe中,再去定位元素。却换iframe,一般使用id和name进行定位iframe就可以,例如:

1 driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@id,'mainframe')]"))

 

切换到iframe中操作完毕后,如果需要切换到另外的iframe,则需要释放,然后再切换进另外的iframe中:

1 driver.switch_to.default_content() #释放iframe

iframe是有层级的,如果需要定位的元素在深层iframe,则需要先切换到一层iframe,在切换到二层iframe,直到所需。

另一种时间设置,有3种设置方法

1、导入time,sleep方法进行强制时间等待,这种方法比较固定,有时需要调整时间数

2、隐性等待implicitly_wait(xx) ,隐性等待是设置一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。但是这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下看到的浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,搞的仍得等到页面全部完成才能执行下一步。另外需要特别说明的是:隐性等待对整个driver的周期都起作用,所以只要设置一次即可,不用像sleep那样每一步都设置一次,比sleep要灵活。

 

1 driver.implicitly_wait(30) # 隐性等待,最长等30秒

 

3、显性等待 :WebDriverWait,看名字就知道是相对隐性等待的,显现等待可以在所需的元素出来后就下一步,不用等到页面加载完毕。配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。显性等待可以和隐性等待同时使用。

1 WebDriverWait(driver, 20, 0.5).until(***)#设置最长时间20,0.5检查

 

元素查找到后,就是对元素进行算单击、双击、输入等操作了,这些可以通过导入 ActionChains 类来做到:

 

 

 

 

 

 

 

posted @ 2020-05-18 15:39  PigFlying  阅读(247)  评论(0)    收藏  举报