1、
通过示例介绍Selenium-WebDriver
一个简单的入门方法就是这个例子,
它在Google上搜索术语“Cheese”,
然后将结果页面的标题输出到控制台。

java csharp python
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
# 可自从2.4.0
from selenium.webdriver.support import expected_conditions as EC
# 可自从2.26.0

driver = webdriver.Firefox()
# 创建Firefox的驱动的一个新实例

driver.get("https://www.google.com")
# 去谷歌主页

print driver.title
# 页面Ajaxy所以标题原来是这样:

inputElement = driver.find_element_by_name("q")
# 找到元素的name属性是Q(谷歌搜索框)

inputElement.send_keys("cheese!")
# 键入搜索

inputElement.submit()
# 提交表单(尽管谷歌自动搜索现在没有提交)

try:
    WebDriverWait(driver, 10).until(EC.title_contains("cheese!"))
    # 我们不得不等待页面刷新,最后一件事,似乎被更新的标题是

    print driver.title
    # 您应该看到"cheese! - Google Search"

finally:
    driver.quit()

2、
抓取页面
您可能想要使用WebDriver做的第一件事是导航到一个页面。
正常的做法是调用“get”:

driver.get("https://www.google.com")

3、
查找UI元素(WebElements)
“Find”方法使用名为“By”的定位器或查询对象。
“By”策略列在下面。

By ID

如何找到如下所示的元素的示例:

<div , labels)

4、
获取文本值

element = driver.find_element_by_id("element_id")
element.text

 

5、
用户输入 - 填写表单

复选框

from selenium.webdriver.support.ui import Select

select = Select(driver.find_element_by_tag_name("select"))
select.deselect_all()
select.select_by_visible_text("Edam")

提交

driver.find_element_by_id("submit").click()

或者

element.submit()

 

6、
在Windows和Frames之间移动

一些Web应用程序有许多框架或多个窗口。
WebDriver支持使用“switchTo”方法在命名窗口之间移动:

driver.switch_to.window("windowName")

或者,
您可以将“窗口句柄”传递给“switchTo().window()”方法。
知道这一点,
可以遍历每个打开的窗口,
如下所示:

for handle in driver.window_handles:
driver.switch_to.window(handle)

您也可以在帧之间切换(或者切换到iframe):

driver.switch_to.frame("frameName")

 

7、
弹出对话框

alert = driver.switch_to.alert
# 用法: alert.dismiss(), etc等

 

8、
导航:历史和位置

driver.get("http://www.example.com")
# Python没有driver.navigate

“导航”界面还提供了在浏览器历史记录中前后移动的功能:

driver.forward()
driver.back()

 

9、
Cookies

driver.get("http://www.example.com")
# 转到正确的域

driver.add_cookie({'name':'key', 'value':'value', 'path':'/'})
# 现在设置cookie。这是整个域的一个
# 这里的cookie名称是“键”,它的值是“值”。
# 可以传入的其他键是:
# 域 -> 字符串,
# 安全 -> 布尔值,
# 到期 -> 毫秒,因为它应该过期。

for cookie in driver.get_cookies():
print "%s -> %s" % (cookie['name'], cookie['value'])
# 现在输出当前URL的所有可用cookie

可以用2种方法删除cookie

driver.delete_cookie("CookieName")
# By name
driver.delete_all_cookies()
# Or all of them

 

10、
更改用户代理

profile = webdriver.FirefoxProfile()
profile.set_preference("general.useragent.override", "some UA string")
driver = webdriver.Firefox(profile)

 

11、
拖放

以下是使用Actions类执行拖放操作的示例。

from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")

ActionChains(driver).drag_and_drop(element, target).perform()

 

12、
显式等待

明确的等待是您定义的代码,
以便在继续执行代码之前等待某种条件发生。
最糟糕的情况是Thread.sleep(),
它将条件设置为等待的确切时间段。
有一些便利的方法可以帮助您编写只会根据需要等待的代码。
WebDriverWait与ExpectedCondition结合是可以实现的一种方式。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0

ff = webdriver.Firefox()
ff.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:
ff.quit()

这会在抛出TimeoutException之前等待10秒,
或者如果它发现该元素将在0-10秒内返回它。
WebDriverWait默认每500毫秒调用一次ExpectedCondition,
直到它成功返回。
ExpectedCondition函数类型的成功返回值是布尔值true或非空对象。

预期条件
自动化网页浏览器时经常遇到一些常见的情况。
下面列出的是使用这些条件的几个例子。

元素是可点击的 - 显示并启用。

from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))

ExpectedConditions包含一组预定义的条件以与WebDriverWait一起使用。

 

13、
隐等待

隐含的等待是告诉WebDriver在尝试查找一个或多个元素(
如果它们不是立即可用的)时轮询DOM一段时间。
默认设置为0.
一旦设置,
就会为WebDriver对象实例的生命周期设置隐式等待。

from selenium import webdriver

ff = webdriver.Firefox()
ff.implicitly_wait(10)
# 秒
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")

相关文章: