美文网首页
利用selenium自动提交表单

利用selenium自动提交表单

作者: 木头左 | 来源:发表于2024-04-22 18:43 被阅读0次
    • 安装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  按照里面的文本查找,比如查找<h1>好呀</h1>find_element_by_link_text("好呀")
     3、find_element_by_partial_link_text   按照文本的部分模糊查找,比如查找<h1>好呀</h1>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代码如下:
    <button id="J_sidebar_login" class="btn btn_big btn_submit" type="submit">登录</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方式。

    相关文章

      网友评论

          本文标题:利用selenium自动提交表单

          本文链接:https://www.haomeiwen.com/subject/rqkixjtx.html