如何添加一个功能来监控链接点击使用硒?



我写了一个小程序来自动点击和保存LinkedIn上的个人资料。

短暂:

  • 程序从含有大量LI url的txt文件中读取。
  • 使用Selenium,它一个接一个地打开它们,然后,点击"在销售导航器中打开";按钮
  • 一个新标签正在打开,在它上面,它需要点击"保存"按钮,并选择相应的列表保存。

我有两个主要问题:

  1. LinkedIn有3个版本的同一页面。如何使用条件来检查页面版本?(意思是-如果你找不到这个按钮,移动到下一个版本)。就我所见,你不能真的使用"如果"功能与硒有关,引起它引起的麻烦。还有其他建议吗?

  2. 更重要的是,我打开这个线程的原因-我想监控失败的"链接。假设我有一个包含1000个LI url的列表,我运行程序将它们保存在我的帐户中。我想监控那些它没有保存或未能打开(破碎的链接,页面不可用等)。为了执行该操作,我使用CSV文件并命令程序保存已保存在该帐户上的所有页面,但这并不能解决我的问题。我怎样才能让他拯救所有的人而不仅仅是那些已经被拯救的人?(我发现它很难执行,因为当一个页面显示为"不可用"时,它会跳转到下一个页面,我找不到让他保存它的方法。这使得它更难工作,因为当我放了500或1000个url,我不能告诉哪些保存,哪些没有保存。

代码如下:

import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as ui
from selenium.webdriver.common.keys import Keys
from time import sleep
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException
import csv
import random

options = webdriver.ChromeOptions()
options.add_argument('--lang=EN')
options.add_argument("--start-maximized")
prefs = {"profile.default_content_setting_values.notifications" : 2}
options.add_experimental_option("prefs",prefs)
driver = webdriver.Chrome(executable_path='assetschromedriver', chrome_options=options)
driver.get("https://www.linkedin.com/login?fromSignIn=true")
minDelay=input("n Please provide min delay in seconds : ")
maxDelay=input("n Please provide max delay in seconds : ")
listNumber=input("n Please provide list number : ")
outputFile=input('n save skipped as?: ')
count=0
closed=2
with open("links.txt", "r") as links:
for link in links:
try:
driver.get(link.strip())
sleep(3)
driver.find_element_by_xpath("//button[@class='save-to-list-dropdown__trigger ph5 artdeco-button artdeco-button--primary artdeco-button--3 artdeco-button--pro artdeco-dropdown__trigger artdeco-dropdown__trigger--placement-bottom ember-view']").click()
sleep(2)
count+=1
if count==1:
driver.find_element_by_xpath("//ul[@class='save-to-list-dropdown__content']//ul//li["+str(listNumber)+"]").click()
else:
driver.find_element_by_xpath("//ul[@class='save-to-list-dropdown__content']//ul//li[1]").click()
sleep(2)
sleep(random.randint(int(minDelay), int(maxDelay)))
except:
if closed==0:
driver.close()
sleep(1)
fileOutput=open(outputFile+".csv", mode='a', newline='', encoding='utf-8')
file_writer = csv.writer(fileOutput, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
file_writer.writerow([link.strip()])
fileOutput.close()
print("Finished.")

拥有不同类型侦听器的常见方法是使用EventFiringWebDriver。请看下面的例子:

from selenium import webdriver
from selenium.webdriver.support.abstract_event_listener import AbstractEventListener
from selenium.webdriver.support.event_firing_webdriver import EventFiringWebDriver

class EventListener(AbstractEventListener):
def before_click(self, element, driver):
if element.tag_name == 'a':
print('Clicking link:', element.get_attribute('href'))

if __name__ == '__main__':
driver = EventFiringWebDriver(driver=webdriver.Firefox(), event_listener=EventListener())
driver.get("https://webelement.click/en/welcome")
link = driver.find_element_by_xpath('//a[text()="All Posts"]')
link.click()
driver.quit()

乌利希期刊指南:

基本上你的案例并不需要那个监听器。但是你可以使用它。假设你有这样一个链接文件:

https://google.com
https://invalid.url
https://duckduckgo.com/
https://sadfsdf.sdf
https://stackoverflow.com

EventFiringWebDriver的方式为:

from selenium import webdriver
from selenium.webdriver.support.abstract_event_listener import AbstractEventListener
from selenium.webdriver.support.event_firing_webdriver import EventFiringWebDriver
broken_urls = []

class EventListener(AbstractEventListener):
def on_exception(self, exception, drv):
broken_urls.append(drv.current_url)

if __name__ == '__main__':
driver = EventFiringWebDriver(driver=webdriver.Firefox(), event_listener=EventListener())
with open("links.txt", "r") as links:
for link in links:
try:
driver.get(link.strip())
except:
print('Cannot reach the link', link.strip())
print("Finished.")
driver.quit()
import csv
with open('broken_urls.csv', 'w', newline='') as broken_urls_csv:
wr = csv.writer(broken_urls_csv, quoting=csv.QUOTE_ALL)
wr.writerow(broken_urls)

,如果没有EventFiringWebDriver,则为:

broken_urls = []
if __name__ == '__main__':
from selenium import webdriver
driver = webdriver.Firefox()
with open("links.txt", "r") as links:
for link in links:
stripped_link = link.strip()
try:
driver.get(stripped_link)
except:
print('Cannot reach the link', link.strip())
broken_urls.append(stripped_link)
print("Finished.")
driver.quit()
import csv
with open('broken_urls.csv', 'w', newline='') as broken_urls_csv:
wr = csv.writer(broken_urls_csv, quoting=csv.QUOTE_ALL)
wr.writerow(broken_urls)

最新更新