Python selenium
声明:本文仅供学习参考,请勿他用。
from time import sleep
from selenium import webdriver
def login():
url =
driver.get(url)
driver.find_element_by_link_text('账号密码登录').click()
driver.find_element_by_id("all").send_keys('usrname')
driver.find_element_by_id("password-number").send_keys('password')
driver.find_element_by_css_selector('button[data-type="account"').click()
def browse(url):
driver.get(url)
original_window = driver.current_window_handle
# <ul class="column_article_list"><li>
articles = driver.find_elements_by_css_selector('ul.column_article_list>li')
for article in articles:
article.click() # 浏览器在新窗口中打开,而 WebDriver 还停留在原地。
sleep(10)
for window_handle in driver.window_handles:
if window_handle != original_window:
driver.switch_to.window(window_handle)
like = driver.find_element_by_id('is-like-span')
if like.text == '点赞':
like.click()
if __name__ == '__main__':
driver = webdriver.Chrome()
login()
sleep(10)
# Selenium 专
browse(url)
driver.quit()
知识点 窗口和标签页
WebDriver 没有区分窗口和标签页。每个窗口都有一个唯一的标识符(句柄)。
driver.getWindowHandle();
1、切换窗口或标签页
单击 在新窗口中打开链接, 则屏幕会聚焦在新窗口或新标签页上, 而 WebDriver 还停留在原地,需要切换到你需要的窗口或选项卡。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 启动驱动程序
with webdriver.Firefox() as driver:
# 打开网址
driver.get("https://seleniumhq.github.io")
# 设置等待
wait = WebDriverWait(driver, 10)
# 存储原始窗口的 ID
original_window = driver.current_window_handle
# 检查一下,我们还没有打开其他的窗口
assert len(driver.window_handles) == 1
# 单击在新窗口中打开的链接
driver.find_element(By.LINK_TEXT, "new window").click()
# 等待新窗口或标签页
wait.until(EC.number_of_windows_to_be(2))
# 循环执行,直到找到一个新的窗口句柄
for window_handle in driver.window_handles:
if window_handle != original_window:
driver.switch_to.window(window_handle)
break
# 等待新标签页完成加载内容
wait.until(EC.title_is("SeleniumHQ Browser Automation"))
2、创建新窗口(或)新标签页并且切换
创建一个新窗口 (或) 标签页,屏幕焦点将聚焦在新窗口或标签在上。您不需要切换到新窗口 (或) 标签页。如果除了新窗口之外, 您打开了两个以上的窗口 (或) 标签页,您可以通过遍历 WebDriver 看到两个窗口或选项卡,并切换到非原始窗口。
注意: 该特性适用于 Selenium 4 及其后续版本。
# 打开新标签页并切换到新标签页
driver.switch_to.new_window('tab')
# 打开一个新窗口并切换到新窗口
driver.switch_to.new_window('window')
3、关闭窗口或标签页
当你完成了一个窗口或标签页的工作时,_并且_它不是浏览器中最后一个打开的窗口或标签页时,你应该关闭它并切换回你之前使用的窗口。 假设您遵循了前一节中的代码示例,您将把前一个窗口句柄存储在一个变量中。把这些放在一起,你会得到:
#关闭标签页或窗口
driver.close()
#切回到之前的标签页或窗口
driver.switch_to.window(original_window)
如果在关闭一个窗口后忘记切换回另一个窗口句柄,WebDriver 将在当前关闭的页面上执行,并触发一个 No Such Window Exception 无此窗口异常。必须切换回有效的窗口句柄才能继续执行。
4、在会话结束时退出浏览器
当你完成了浏览器会话,你应该调用 quit 退出,而不是 close 关闭:
driver.quit()
退出将会
- 关闭所有与 WebDriver 会话相关的窗口和选项卡
- 结束浏览器进程
- 结束后台驱动进程
- 通知 Selenium Grid 浏览器不再使用,以便可以由另一个会话使用它(如果您正在使用 Selenium Grid)
调用 quit() 失败将留下额外的后台进程和端口运行在机器上,这可能在以后导致一些问题。
有的测试框架提供了一些方法和注释,您可以在测试结束时放入 teardown() 方法中。
# unittest teardown
# https://docs.python.org/3/library/unittest.html?highlight=teardown#unittest.TestCase.tearDown
def tearDown(self):
self.driver.quit()
如果不在测试上下文中运行 WebDriver,您可以考虑使用 try / finally,这是大多数语言都提供的, 这样一个异常处理仍然可以清理 WebDriver 会话。
try:
#WebDriver 代码…
finally:
driver.quit()
Python 的 WebDriver 现在支持 Python 上下文管理器,当使用 with 关键字时,可以在执行结束时自动退出驱动程序。
with webdriver.Firefox() as driver:
# WebDriver 代码…
# 在此缩进位置后 WebDriver 会自动退出