单击LinkedIn页面上的每个按钮都有问题。在一些个人资料中,包含了很多关于工作经历、学校、执照的信息,我们必须通过点击“显示更多的按钮”来扩展这些信息。
我尝试了许多方法,比如使用Xpath搜索元素,然后循环它们来单击页面上的每个按钮,但是都没有工作--因为每个按钮类都与使用selenium的其他元素相同。我认为,第一个“显示更多”按钮总是用于体验部分,代码使作业单击它:
self.driver.execute_script("arguments[0].click();", WebDriverWait(
self.driver, 3).until(EC.element_to_be_clickable((By.XPATH, "//li-icon[@class='pv-profile"
"-section__toggle-detail-icon']"))))
然后我们有教育部门,执照和认证部门--这给我带来了麻烦。临时解决方案是单击包含字符串的元素:
self.driver.find_element_by_xpath("//*[contains(text(), 'Pokaż więcej')]").click()
或
self.driver.find_element_by_xpath("//*[contains(text(), 'Pokaż 1 uczelnię więcej')]").click()
早晚我就知道代码有很多限制。有没有人对如何解决这个问题有更好的想法?
解决方案
containers = self.driver.find_elements_by_xpath("//li-icon[@class='pv-profile-section__toggle-detail-icon']")
for button in containers:
self.driver.execute_script('arguments[0].click()', button)
发布于 2021-11-11 16:10:05
我用自己的代码测试了页面,看起来您可以使用
items = driver.find_elements(By.XPATH, '//div[@class="profile-detail"]//button')
for item in items:
driver.execute_script("arguments[0].click();", item)
但可能还有其他问题。页面使用"lazy loading"
,它可能需要使用JavaScript代码,该代码向下滚动以加载所有组件。
这是我的完整代码,在评论中有一些想法。
我也尝试过在部分中选择按钮,但并不是所有的方法都有效。
但也许它会对其他的想法有用。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException
import time
USERNAME = 'XXXXX'
PASSWORD = 'YYYYY'
url = 'https://www.linkedin.com/in/jakub-bialoskorski/?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABp5UJ8BDpi5ZwNGebljqDlYx7OXIKgxH80'
driver = webdriver.Firefox()
# -------------------------------------
driver.get(url)
time.sleep(5)
#wait = WebDriverWait(driver, 10)
cookies = driver.find_element(By.XPATH, '//button[@action-type="ACCEPT"]')
cookies.click()
time.sleep(1)
link = driver.find_element(By.XPATH, '//p[@class="authwall-join-form__subtitle"]/button')
link.click()
time.sleep(1)
login_form = driver.find_element(By.XPATH, '//div[@class="authwall-sign-in-form"]')
time.sleep(1)
username = login_form.find_element(By.XPATH, '//input[@id="session_key"]')
username.send_keys(USERNAME)
password = login_form.find_element(By.XPATH, '//input[@id="session_password"]')
password.send_keys(PASSWORD)
time.sleep(1)
#button = login_form.find_element(By.XPATH, '//button[@type="submit"]')
button = login_form.find_element(By.XPATH, '//button[contains(text(), "Zaloguj się")]')
button.click()
time.sleep(5)
# -------------------------------------
url = 'https://www.linkedin.com/in/jakub-bialoskorski/?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABp5UJ8BDpi5ZwNGebljqDlYx7OXIKgxH80'
#from selenium.webdriver.common.action_chains import ActionChains
driver.get(url)
time.sleep(5)
# -----------
print('... scrolling for lazy loading ...')
last_height = 0
while True:
driver.execute_script("window.scrollTo(0, window.scrollY + window.innerHeight);")
time.sleep(2)
new_height = driver.execute_script("return window.scrollY")
if new_height == last_height:
break
last_height = new_height
# -----------
def click_items(items):
for item in items:
print('text:', item.text)
#print(item.get_attribute('innerHTML'))
#print('... scrolling ...')
#ActionChains(driver).move_to_element(item).perform()
print('... scrolling ...')
driver.execute_script("arguments[0].scrollIntoView(true);", item)
#print('... clicking ...')
#item.click()
#time.sleep(1)
print('... clicking ...')
driver.execute_script("arguments[0].click();", item)
time.sleep(1)
print('----')
print('\n>>> Pokaż <<<\n')
#items = driver.find_elements(By.XPATH, '//button[contains(text(), "Pokaż")]')
#click_items(items)
print('\n>>> Doświadczenie - Pokaż więcej <<<\n')
#section = driver.find_elements(By.XPATH, '//section[@id="experience-section"]')
#items = driver.find_elements(By.XPATH, '//button[contains(text(), "zobacz wi")]')
items = driver.find_elements(By.XPATH, '//button[contains(@class, "inline-show-more-text__button")]')
click_items(items)
print('\n>>> Umiejętności i potwierdzenia - Pokaż więcej <<<\n')
#section = driver.find_elements(By.XPATH, '//section[@id="experience-section"]')
items = driver.find_elements(By.XPATH, '//button[@data-control-name="skill_details"]')
click_items(items)
print('\n>>> Wyświetl <<<\n')
items = driver.find_elements(By.XPATH, '//button[contains(text(), "Wyświetl")]')
click_items(items)
print('\n>>> Rekomendacje <<<\n')
items = driver.find_elements(By.XPATH, '//button[@aria-controls="recommendation-list"]')
click_items(items)
print('\n>>> Osiągnięcia <<<\n')
print('--- projects ---')
items = driver.find_elements(By.XPATH, '//button[@aria-controls="projects-expandable-content"]')
click_items(items)
print('--- languages ---')
items = driver.find_elements(By.XPATH, '//button[@aria-controls="languages-expandable-content"]')
click_items(items)
# --- all buttons ---
#items = driver.find_elements(By.XPATH, '//div[@class="profile-detail"]//button')
#click_items(items)
https://stackoverflow.com/questions/69921461
复制相似问题