Selenium学习(1)

1、环境安装:pip install selenium

#创建一个Chrome浏览器的WebDriver实例对象,指明使用chrome浏览器驱动
wd=webdriver.Chrome(service=Service(r'C:\Users\user\.cache\selenium\chromedriver\win32\114.0.5735.90\chromedriver.exe'))

上面的代码做到了三件事

1、找到了浏览器驱动

2、运行浏览器

3、运行本身代码

webdriver是像遥控器一样控制浏览器运行的。它的底层原理就是构造一个http请求打开网址。

wd.get('https://www.baidu.com')

如何在打开的输入框中进行搜索呢?

2、需要进行选择元素

告诉浏览器,要操作web元素的特征。

我们需要得到界面的输入框。

按F12进入开发者模式,再分别按这两下找到搜索框在的位置。

点下搜索框即可定位到。

 

我们可以发现搜索框唯一的特征比如id值id:'wd',可以把id想象成元素的编号,用来在html中标记该元素,大部分id是唯一的。

需要先导入By,然后在获取到的WebDriver对象wd调用find_element,根据独特的ID:’kw‘获取元素。

from selenium.webdriver.common.by import By
element=wd.find_element(By.ID,'kw')

假如不存在该元素,find_element方法就会抛出异常

获得到element之后,再给element填充上值

element.send_keys('东南大学')

 再次运行即可实现自动填充。

 我们用相同的方法获取’百度一下‘的按钮,其id是'su',将其保存为element2,然后执行点击操作。

element2=wd.find_element(By.ID,'su')
element2.click()

即可完成自动化搜索。

 3、根据class属性,tag名 选择元素

https://cdn2.byhy.net/files/selenium/sample1.html这是本次测试网站

在<>里面的都是元素的属性

而紧跟着<>的‘input’叫做元素的标签名。

目前需要根据'class'属性选择标签名

如果我们要选择所有相同类名的元素,我们使用方法find_elements_by_class_name,因为元素不止一个,所以使用列表来存储。

 记得import ... By,这里使用find_elements,注意比上面多加了一个s。如果使用find_element是选择符合条件的第一个元素。如果没有满足条件的,则返回一个空列表。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

#创建一个Chrome浏览器的WebDriver实例对象,指明使用chrome浏览器驱动
wd=webdriver.Chrome()
wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')

elements=wd.find_elements(By.CLASS_NAME,'animal')
for element in elements:
    print(element.text)
input()

 4、选择所有tag名为div的元素

还是使用find_elements,不过By.TAG_NAME

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

#创建一个Chrome浏览器的WebDriver实例对象,指明使用chrome浏览器驱动
wd=webdriver.Chrome()
wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')

elements=wd.find_elements(By.TAG_NAME,'span')
for element in elements:
    print(element.text)
input()

注意无论如何都需要from selenium.webdriver.common.by import By,这一步很重要。

5、通过WebElement对象选择元素

我们上面使用了WebDriver对象来选择元素,而WebElement对象也有选择元素的方法。

WebElement对象也可以调用find_element和find_elements这种方法

WebDriver对象选择元素的范围是整个web界面,而WebElement对象选择元素的范围是该元素的内部。

首先用wd调用find_element获得WebElements对象,然后WebElements对象也能调用find_elements,只不过选择范围是在ID=container的内部。

5、等待元素出现

测试网站如图,查询按钮的ID是‘go’,输入框的ID是‘kw’

首先运行输入‘通讯’,再点击查询,切换到另一个界面。

#创建一个Chrome浏览器的WebDriver实例对象,指明使用chrome浏览器驱动
wd=webdriver.Chrome()
wd.get('https://www.byhy.net/_files/stock1.html')

element=wd.find_element(By.ID,'kw')
element.send_keys('通讯')

element=wd.find_element(By.ID,'go')
element.click()

之后如果我们直接运行寻找ID=‘1’的情况,可能会直接报错。

这是由于程序执行的速度太快了,但是网速并没有那么快,没反应过来。因此我们需要程序暂停休息一会。可以使用time.sleep()

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

#创建一个Chrome浏览器的WebDriver实例对象,指明使用chrome浏览器驱动
wd=webdriver.Chrome()
wd.get('https://www.byhy.net/_files/stock1.html')

element=wd.find_element(By.ID,'kw')
element.send_keys('通讯')

element=wd.find_element(By.ID,'go')
element.click()

#这一步是将程序暂停一秒
time.sleep(1)

element=wd.find_element(By.ID,'1')
print(element.text)

input()

但是这又引起一个情况,time.sleep()的时间不能写死。因为实际生产中难以判断。所以需要借助循环和抛出异常来判断。改进后的代码如下。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

#创建一个Chrome浏览器的WebDriver实例对象,指明使用chrome浏览器驱动
wd=webdriver.Chrome()
wd.get('https://www.byhy.net/_files/stock1.html')

element=wd.find_element(By.ID,'kw')
element.send_keys('通讯')

element=wd.find_element(By.ID,'go')
element.click()

#用循环和抛出异常来确定程序休息的时间

while True:
    try:
        element=wd.find_element(By.ID,'1')
        print(element.text)
        break
    except:
        time.sleep(0.1)


input()

当然,Selenium提供了隐式等待,底层原理和抛出异常一致。

当发现元素没找到时,并不立刻返回找不到元素的错误,而是每隔半秒重新寻找该元素,直到元素被找到。或者超出指定最大等待时长,这时才抛出异常。

Selenium的Webdriver对象有个方法叫implicitly_wait,该方法接受一个参数,用来指定最大等待时长。

wd.implicitly_wait(1)

简化后的代码如下: 

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

#创建一个Chrome浏览器的WebDriver实例对象,指明使用chrome浏览器驱动
wd=webdriver.Chrome()
wd.get('https://www.byhy.net/_files/stock1.html')
wd.implicitly_wait(1)
element=wd.find_element(By.ID,'kw')
element.send_keys('通讯')

element=wd.find_element(By.ID,'go')
element.click()

#用循环和抛出异常来确定程序休息的时间
element=wd.find_element(By.ID,'1')
print(element.text)




input()

6、操纵元素

操纵元素主要包括

  1. 点击元素
  2. 在元素中输入字符串
  3. 获取元素包含的信息,比如文本内容,元素的属性
  • 点击元素

element.click()

  • 输入字符串

element.clear()#清除输入框已有的字符串

element.send_keys()#输入新字符串

  • 获取元素的文本内容

element.text

  •  获取元素属性

element.get_attribute('class') 

可以加上参数'outerHTML'来获取整个元素html

element=wd.find_element(By.ID,'1')
print(element.get_attribute('outerHTML'))

 使用'innerHTML'可以获得里面的html部分

element=wd.find_element(By.ID,'1')
print(element.get_attribute('innerHTML'))

一般来说可以使用element.text打印出文本信息,但是输入框比较特殊。需要使用element.get_attribute('value')来获取输入框中的文本。

同伙WebElement对象的text属性,可以获取元素在界面上的文本内容,但是偶的时候元素的文本内容没有展示在界面上,或者没有完全展示在界面上。这时,用WebElement对象的text属性,获取文本内容,就有问题。

出现这种情况,可以尝试使用element.get_attribute('innerText'),或者element.get_attribute('textContent').

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值