利用selenium自动提交表单

  • 安装selenium

pip --trusted-host pypi.tuna.tsinghua.edu.cn install selenium

pip --trusted-host mirrors.aliyun.com install cookielib

pip --trusted-host pypi.douban.com install cookielib

  • 安装chromedriver

chromedriver下载地址

http://npm.taobao.org/mirrors/chromedriver/(可用)

注意 :chromedriver的版本要与你使用的chrome版本对应,note中有

解压的chromedriver.exe放进文件夹,再配置进path环境变量

  • 如果环境变量未生效,可写入代码中
  • ChromeDriverServer = '''C:\Users\pengzuo\AppData\Local\Google\Chrome\chromedriver.exe'''os.environ["webdriver.chrome.driver"] = ChromeDriverServer brguge = webdriver.Chrome(executable_path=ChromeDriverServer) brguge.get('https://www.baidu.com')#发送get请求input=brguge.find_element_by_id('kw')#找到目标

  • 查找

Selenium-Webdriver

Intro:

  Selenium是元素se(硒)。这个Selenium(以下简称Se)最开始只是一个自动化测试的项目,然后逐渐独立出来,并演化出了很多部分:Selenium IDE、Selenium Client API、Selenium Webdriver、Selenium Remote Control、Selenium Grid. Se对firefox支持较为友好!webdriver对firefox做了原生支持。并且Selenium IDE是firefox上的一个插件。可惜,Firefox更新了Quantum(57),大改了内核。目前Selenium IDE还是处在不适合当前版本的状态。

具体详见:https://www.cnblogs.com/yogayan/p/6710119.html

  

一、安装

  这里安装的就是selenium Client API

  python: pip install selenium

  配合浏览器驱动:

  chromedriver  欢迎大家FQ下载:https://sites.google.com/a/chromium.org/chromedriver/downloads。然后找个环境路径存一下就可以调用了。

  IEdriver      github下载:https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver 。 同样环境路径保存。

          注意:IE玩家把internet选项-安全- 四个选项的启动保护模式都关掉!

PhantomJS     直接解压,把bin目录放在环境路径中

  Opera以及geckodriver试了一下,对最新的opera和firefox都不怎么好使。当然可以下载较低的版本使用。(所以以下所有测试都选择了IE9)

二、基本使用

2.1 启动浏览器

from selenium import webdriver
driver=webdriver.Ie()   #或者webdriver.Chrome()
driver.get('https://www.baidu.com') 
driver.page_source    #拿到所有html内容,注意这里可能显示不全,因为网速跟不上程序嘛
driver.close()    #关闭浏览器

** 2.2 常用接口**

from selenium import webdriver
from selenium.webdriver import ActionChains  #这个是模仿鼠标动作的
from selenium.webdriver.common.by import By #这个是设置查找方式的By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #这个是模拟键盘按键操作的
from selenium.webdriver.support import expected_conditions  #这个是标注状态的
from selenium.webdriver.support.wait import WebDriverWait #这个是等待页面加载某些元素

2.3 选择器

1、find_element_by_id        按照id 查找
     2、find_element_by_link_text  按照里面的文本查找,比如查找

好呀

find_element_by_link_text("好呀")
     3、find_element_by_partial_link_text   按照文本的部分模糊查找,比如查找

好呀

find_element_by_link_text("好")
     4、find_element_by_tag_name    按照标签名
     5、find_element_by_class_name    按照类名
     6、find_element_by_name        按照name属性查找
     7、find_element_by_css_selector    css选择器的方式查找
     8、find_element_by_xpath/find_elements_by_xpath       比较神奇的查找方式

   9、所有方式均可以用find_element(By.ID,"lala")这种形式替代

   p.s. 一些方法取到的是元素集合,用索引或者for循环取单独的值。
 
下面是查找多个元素(这些方法将返回一个列表):
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

a. 用contains关键字,定位代码如下:
1 driver.findElement(By.xpath(“//a[contains(@href, ‘logout’)]”));

这句话的意思是寻找页面中href属性值包含有logout这个单词的所有a元素,由于这个退出按钮的href属性里肯定会包含logout,所以这种方式是可行的,也会经常用到。其中@后面可以跟该元素任意的属性名。

b. 用start-with,定位代码如下:
1 driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)]));

这句的意思是寻找rel属性以nofo开头的a元素。其中@后面的rel可以替换成元素的任意其他属性。

c. 用Text关键字,定位代码如下:
1 driver.findElement(By.xpath(“//*[text()=’退出’]));

这个方法可谓相当霸气啊。直接查找页面当中所有的退出二字,根本就不用知道它是个a元素了。这种方法也经常用于纯文字的查找。

另外,如果知道超链接元素的文本内容,也可以用
1 driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));

这种方式一般用于知道超链接上显示的部分或全部文本信息时,可以使用。

最后,关于xpath这种定位方式,webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,所以这是一个非常费时的操作,如果你的脚本中大量使用xpath做元素定位的话,将导致你的脚本执行速度大大降低,所以请慎用。

8. By.cssSelector()

cssSelector这种元素定位方式跟xpath比较类似,但执行速度较快,而且各种浏览器对它的支持都相当到位,所以功能也是蛮强大的。

下面是一些常见的cssSelector的定位方式:

定位id为flrs的div元素,可以写成:#flrs     注:相当于xpath语法的//div[@id=’flrs’]

定位id为flrs下的a元素,可以写成 #flrs > a  注:相当于xpath语法的//div[@id=’flrs’]/a

定位id为flrs下的href属性值为/forexample/about.html的元素,可以写成: #flrs > a[href=”/forexample/about.html”]

如果需要指定多个属性值时,可以逐一加在后面,如#flrs > input[name=”username”][type=”text”]。

明白基本语法后,我们来尝试用cssSelector方式来引用图(3)中选中的那个input对象,代码如下:
WebElement password = driver.findElement(By.cssSelector("#J_login_form>dl>dt>input[id=’ J_password’]"));

同样必须注意层级关系,这个不能省略。

cssSelector还有一个用处是定位使用了复合样式表的元素,之前在第4种方式className里面提到过。现在我们就来看看如何通过cssSelector来引用到第4种方式中提到的那个button。button代码如下:

cssSelector引用元素代码如下:
driver.findElement(By.cssSelector("button.btn.btn_big.btn_submit"))

。这样就可以顺利引用到使用了复合样式的元素了。

此外,cssSelector还有一些高级用法,如果熟练后可以更加方便地帮助我们定位元素,如我们可以利用^用于匹配一个前缀,$用于匹配一个后缀,*用于匹配任意字符。例如:

匹配一个有id属性,并且id属性是以”id_prefix_”开头的超链接元素:a[id^='id_prefix_']

匹配一个有id属性,并且id属性是以”_id_sufix”结尾的超链接元素:a[id$='_id_sufix']

匹配一个有id属性,并且id属性中包含”id_pattern”字符的超链接元素:a[id*='id_pattern']

最后再总结一下,各种方式在选择的时候应该怎么选择:

  1. 当页面元素有id属性时,最好尽量用id来定位。但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法。

  2. xpath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。

  3. 当要定位一组元素相同元素时,可以考虑用tagName或name。

  4. 当有链接需要定位时,可以考虑linkText或partialLinkText方式。

posted @ 2024-04-23 18:45  木头左  阅读(52)  评论(0编辑  收藏  举报