首页 > 解决方案 > Selenium(Python)替代带有索引的for循环

问题描述

有没有一种更有效的方法来读取具有相同名称的类,而不是做我正在做的事情,我基本上通过索引的代码,因为它们都具有相同的名称,如果选择具有相同类的元素,是否有更好的方法名字,而不是我做的方式

Z = len(driver.find_elements_by_class_name('Class_With_Names'))

for x in range(Z):

x += 1

thisClass = driver.find_element_by_xpath(f"//ul[@class='same_name']/div[{str(x)}]")
classText = thisClass.find_element_by_class_name("class_with_text")

print(classText.text)

标签: pythonseleniumloopsfor-loopselenium-webdriver

解决方案


避免索引,您可以使用以下定位器策略

要从所有使用Selenium中提取和打印文本,例如AppleOrange等,您可以使用以下任一Locator Strategies<li class="Fruit">

  • 使用css_selectorget_attribute("innerHTML")

    print([my_elem.get_attribute("innerHTML") for my_elem in driver.find_elements_by_css_selector("ul.same_name div")])
    
  • 使用xpath文本属性:

    print([my_elem.text for my_elem in driver.find_elements_by_xpath("//ul[@class='same_name']//div")])
    

理想情况下,您需要诱导WebDriverWait并且visibility_of_all_elements_located()您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTORget_attribute("innerHTML")

    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "ul.same_name div")))])
    
  • 使用XPATH文本属性:

    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//ul[@class='same_name']//div")))])
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

奥特罗

链接到有用的文档:


推荐阅读