1.第一个脚本实现打开网页并定位元素,搜索,显示结果。
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
class PythonOrgSearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def test_search_in_python_org(self):
driver = self.driver
driver.get("http://www.python.org")
self.assertIn("Python", driver.title)
elem = driver.find_element("name","q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()
目前能够运行。问题:大部分教程中定位元素使用的如
element = driver.find_element_by_id("passwd-id")
运行会报错如下AttributeError: 'WebDriver' object has no attribute 'find_element_by_name'可能是By方法的问题,可以用driver.find_element("name","q")代替。
解决方法:导入By。
from selenium.webdriver.common.by import By
但是大部分教程都没有写导入By导致代码无法直接拿来运行。
现在尝试进行更多操作:点击列表,发现难以定位元素,定位后也无法点击,分别报错
Message: no such element: Unable to locate element(无法定位元素)
Message: element not interactable(无法交互)
尝试过文字定位、ID、classname等,最后使用chrome控制台中右键元素复制绝对xpath地址;无法交互是因为元素可能藏在列表、菜单中,需要先点击上一级按钮使之显现才能点击;也有可能是网页有动态效果,要加载一两秒才能展示元素,这时候可以简单地time.sleep(3)。xpath的局限就是网页稍作改变脚本就会失效。
代码:(仅作参考)
import unittest
from selenium import webdriver
class PythonOrgSearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def test_search_in_python_org(self):
driver = self.driver
driver.get("http://********/")
self.assertIn("新*****台", driver.title)
driver.find_element("xpath", "/html/body/div--/div[1]/div[1]/a[1]").click()
driver.find_element("xpath", "/html/body/div--/div[1]/div[1]/div[1]/a[1]").click()
assert "No results found." not in driver.page_source
time.sleep(20)
"""def tearDown(self):
self.driver.close()"""
if __name__ == "__main__":
unittest.main()
最近又学了点requests的内容,今天做了selenium的自动登录抓取内容。
import unittest
import time
from selenium import webdriver
class PythonSelenium(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def test_selenium(self):
driver = self.driver
url = "http://1***********a/login"
driver.get(url)
self.assertIn("****平台", driver.title)
time.sleep(3)
driver.find_element("id", "username").send_keys("admin")
driver.find_element("id", "password").send_keys("123456")
driver.find_element("xpath", "// *[ @ id = 'loginForm'] / input[3]").click()
time.sleep(5)
driver.switch_to.frame("mainFrame")
for i in range(7):
if(driver.find_element("xpath", f"/html/body/div[3]/table/tbody/tr[{i+1}]/td[4]/span").text=="已处理"):
print(f"有第{i+1}条已处理")
if __name__ == "__main__":
unittest.main()
目标网页需要先登录,然后从页面中抓取数据并判断。
遇到的问题主要是登录后无法定位目标(又是无法定位),这次是因为网页采用了iframe,我是在定位失败后抓取页面源码发现没有我要找到数据后才确定的原因。需要driver.switch_to.frame重定位目标所在frame,然后再去抓取目标数据。