西安十強(qiáng)網(wǎng)絡(luò)公司搜索引擎優(yōu)化大致包含哪些內(nèi)容或環(huán)節(jié)
場(chǎng)景
點(diǎn)擊添加”新增“按鈕,彈出”新增對(duì)話框“,輸入各種數(shù)據(jù),然后點(diǎn)擊”確定“按鈕,如此循環(huán)。數(shù)量多,這樣操作累人。
selenium
Selenium 是一個(gè)用于自動(dòng)化 Web 瀏覽器操作的庫(kù),可以實(shí)現(xiàn)模擬點(diǎn)擊、輸入文本等操作。
代碼實(shí)現(xiàn)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-from selenium import webdriver
from selenium.common.exceptions import ElementNotInteractableException
from selenium.common.exceptions import ElementNotSelectableException
from selenium.common.exceptions import InvalidSelectorException
from selenium.common.exceptions import NoSuchAttributeException
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoSuchFrameException
from selenium.common.exceptions import NoSuchWindowException
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time# 目標(biāo)頁(yè)面
target_url = "https://test.abc.com/12311/application/#/application/update/2310?mode=edit&env=prod"# 創(chuàng)建一個(gè)Chrome瀏覽器實(shí)例
#browser = webdriver.Chrome(executable_path=driver_path)
browser = webdriver.Chrome()# 打開一個(gè)網(wǎng)頁(yè)
browser.get(target_url)
time.sleep(0.5)try:# 點(diǎn)擊“快速登錄”按鈕print('模擬點(diǎn)擊“快速登錄”按鈕')browser.find_element(By.ID, "btn_quicklogin").click()time.sleep(1)print('模擬點(diǎn)擊“下一步”按鈕')# 使用 class 屬性定位button = browser.find_element(By.CSS_SELECTOR, ".footer>button")button.click()time.sleep(1)# 填充for index, metric_pair in enumerate(metric_pair_array):metric = metric_pair.split(':')print("\033[93m==============================\033[0m")print("(%d) %s" % (len(metric), metric_pair))if len(metric) == 2:metric_name = metric[0]li_element_index = index * 10print("metric_name:%s, index:%d, li_element_index:%d" % (metric_name, index, li_element_index))# 點(diǎn)擊“新增”按鈕browser.find_element(By.CSS_SELECTOR, ".table-view__operations-left>.t-button--theme-primary").click()time.sleep(1)# 中文名browser.find_element(By.CSS_SELECTOR, ".t-form-item__metric_chname .t-input__inner").send_keys(metric_name)# 英文名browser.find_element(By.CSS_SELECTOR, ".t-form-item__metric_enname .t-input__inner").send_keys(metric_name)# 類型print('點(diǎn)擊“箭頭”按鈕')browser.find_element(By.CSS_SELECTOR, ".t-form-item__type .t-input--suffix").click()li_elements = browser.find_elements(By.CSS_SELECTOR, ".t-select__dropdown .t-select__list .t-size-m") # li_elements 為大小為 4 的 listprint("type of li_elements: %s" % type(li_elements))if isinstance(li_elements, list): # 判斷元素是否為列表類型print("size of li_elements: %s" % len(li_elements))target_li = li_elements[0 + li_element_index]target_li.click()# 單位print('點(diǎn)擊“箭頭”按鈕')browser.find_element(By.CSS_SELECTOR, ".t-form-item__unit .t-input--suffix").click()li_elements = browser.find_elements(By.CSS_SELECTOR, ".t-select__dropdown .t-select__list .t-size-m") # li_elements 為大小為 10 的 list,包含了前面一步得到的 4 個(gè)print("type of li_elements: %s" % type(li_elements))if isinstance(li_elements, list):print("size of li_elements: %s" % len(li_elements))target_li = li_elements[6 + li_element_index]target_li.click()# 點(diǎn)擊“確定”按鈕browser.find_element(By.CSS_SELECTOR, ".t-dialog__footer .t-button--theme-primary").click()print("")
except ElementNotInteractableException as msg:print(u"Element not interactable: %s" % (msg))
except ElementNotSelectableException as msg:print(u"Element not selected: %s" % (msg))
except InvalidSelectorException as msg:print(u"Invalid selector: %s" % (msg))
except NoSuchAttributeException as msg:print(u"Attribute not found: %s" % (msg))
except NoSuchElementException as msg:print(u"Element not found: %s" % (msg))
except NoSuchFrameException as msg:print(u"Frame not found: %s" % (msg))
except NoSuchWindowException as msg:print(u"Window not found: %s" % (msg))
except TimeoutException as msg:print(u"Find element timeout: %s" % (msg))
else:input('按 “Enter” 鍵退出 ...')# 關(guān)閉瀏覽器
#browser.quit()
find_element
在 Selenium 中,find_element 方法用于定位頁(yè)面元素,通常與 CSS 選擇器一起使用。在 CSS 選擇器中,>和空格有著不同的含義:
- .:
這是一個(gè)類選擇器。它選擇所有具有指定類名的元素。例如 .myClass 會(huì)選擇所有具有類名 myClass 的元素。
- >:
這是一個(gè)子元素選擇器。它選擇所有直接的子元素。例如,div > p 會(huì)選擇所有 div 元素的直接子元素 p。
- 空格:
這是一個(gè)后代選擇器。它選擇所有的子元素,不僅僅是直接的子元素,還包括孫子元素、曾孫元素等。例如,div p 會(huì)選擇 div 元素下的所有 p 元素,無(wú)論p元素是 div 的直接子元素,還是更深層次的后代元素。
這兩個(gè)選擇器在定位元素時(shí)非常有用,可以幫助更精確地選擇想要的元素。如果目標(biāo)存在多個(gè),則應(yīng)當(dāng)使用 find_elements。
By.CSS_SELECTOR 和 By.CLASS_NAME
在 Selenium 中,By.CSS_SELECTOR 和 By.CLASS_NAME 都是用于定位頁(yè)面元素的方法,但它們的使用方式和目標(biāo)有所不同。
- By.CSS_SELECTOR:
這個(gè)方法允許使用 CSS 選擇器來(lái)定位頁(yè)面元素。CSS 選擇器是一種強(qiáng)大的定位方式,可以通過(guò)元素的屬性、層次結(jié)構(gòu)和偽類等來(lái)定位元素。例如,可以使用 By.CSS_SELECTOR 來(lái)定位具有特定 ID、類名、屬性或子元素的元素。
# 定位具有特定ID的元素
element = browser.find_element(By.CSS_SELECTOR, "#element_id")# 定位具有特定類名的元素
element = browser.find_element(By.CSS_SELECTOR, ".element_class")# 定位具有特定屬性的元素
element = browser.find_element(By.CSS_SELECTOR, "input[type='text']")# 定位具有特定子元素的元素
element = browser.find_element(By.CSS_SELECTOR, "div > p")
- By.CLASS_NAME:
這個(gè)方法專門用于定位具有特定類名的元素。它只能通過(guò)類名來(lái)定位元素,而不能使用其他屬性或?qū)哟谓Y(jié)構(gòu)。如果只需要根據(jù)類名來(lái)定位元素,By.CLASS_NAME 是一個(gè)簡(jiǎn)單直接的選擇。
# 定位具有特定類名的元素
element = browser.find_element(By.CLASS_NAME, "element_class")
總之,By.CSS_SELECTOR 提供了更多的靈活性和定位能力,而 By.CLASS_NAME 則專注于通過(guò)類名來(lái)定位元素。根據(jù)需求和目標(biāo)元素的特點(diǎn),可以選擇使用適當(dāng)?shù)姆椒▉?lái)定位頁(yè)面元素。