首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用相同的xpath、类单击几个按钮

如何使用相同的xpath、类单击几个按钮
EN

Stack Overflow用户
提问于 2021-11-10 23:32:43
回答 1查看 906关注 0票数 1

单击LinkedIn页面上的每个按钮都有问题。在一些个人资料中,包含了很多关于工作经历、学校、执照的信息,我们必须通过点击“显示更多的按钮”来扩展这些信息。

样本剖面1

样本剖面2

我尝试了许多方法,比如使用Xpath搜索元素,然后循环它们来单击页面上的每个按钮,但是都没有工作--因为每个按钮类都与使用selenium的其他元素相同。我认为,第一个“显示更多”按钮总是用于体验部分,代码使作业单击它:

代码语言:javascript
运行
复制
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']"))))

然后我们有教育部门,执照和认证部门--这给我带来了麻烦。临时解决方案是单击包含字符串的元素:

代码语言:javascript
运行
复制
self.driver.find_element_by_xpath("//*[contains(text(), 'Pokaż więcej')]").click()

代码语言:javascript
运行
复制
self.driver.find_element_by_xpath("//*[contains(text(), 'Pokaż 1 uczelnię więcej')]").click()

早晚我就知道代码有很多限制。有没有人对如何解决这个问题有更好的想法?

解决方案

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-12 00:10:05

我用自己的代码测试了页面,看起来您可以使用

代码语言:javascript
运行
复制
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代码,该代码向下滚动以加载所有组件。

这是我的完整代码,在评论中有一些想法。

我也尝试过在部分中选择按钮,但并不是所有的方法都有效。

但也许它会对其他的想法有用。

代码语言: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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69921461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档