【问题标题】:Python Selenium: Iterating through a dynamic elementPython Selenium:遍历动态元素
【发布时间】:2020-03-09 11:20:50
【问题描述】:

我确信这可能以前被问过,但我还没有遇到过。如果它已经在这里,我很抱歉。但是,我在试图弄清楚逻辑时遇到了问题:该页面以我希望单击的元素列表(开始 20 个)开始。滚动后,会显示更多相同的元素。我在滚动后与加载的元素进行交互时遇到问题。到目前为止,这是我想出的:

def clix():
chazz = driver.find_elements_by_css_selector("button[class^='message-anywhere']")
for x in chazz:
    if x.is_displayed():
            x.click()
            time.sleep(1)
            driver.find_element_by_css_selector("button[data-control-name^='overlay.close']").click()
            time.sleep(2)

scrollz()
def scrollz():
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
    time.sleep(4)
    clix()
clix()

我知道这并不是应有的“pythonic”或“最佳实践”。我只是担心功能。任何见解将不胜感激。 driver.find_element_by_css_selector("button[data-control-name^='overlay.close']").click() 按钮仅用于弹出一个窗口。

谢谢

html:

<button class="message-anywhere-button artdeco-button artdeco-button--secondary artdeco-button--2" aria-label="Send message to Abarna Rajkumar" data-ember-action="" data-ember-action-63="63">
    Chat
</button>

【问题讨论】:

  • 您能否为您尝试自动化的页面发布一些 HTML,包括您在此测试中定位的元素?这将帮助任何试图回答您的问题的人更有效地解决您的问题。
  • 我添加了按钮的html。识别按钮不是问题。一旦加载了更多元素,脚本就会迷失在索引中的位置,我不知道如何为此编写逻辑。

标签: python selenium loops dynamic


【解决方案1】:

我认为只有一个功能可以解决您的问题。我可能会错,因为我没有正在测试的应用程序。

  • 诱导WebDiverWait并等待visibility_of_all_elements_located()
  • 迭代时使用location_once_scrolled_into_view,然后单击。
  • 诱导WebDiverWait并等待element_to_be_clickable()点击关闭按钮

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

def clix():
 chazz =WebDriverWait(driver,20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"button[class^='message-anywhere']")))
 for x in range(len(chazz)):
    chazz = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "button[class^='message-anywhere']")))
    chazz[x].location_once_scrolled_into_view
    chazz[x].click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"button[data-control-name^='overlay.close']"))).click()

clix()

【讨论】:

    【解决方案2】:

    chazz = driver.find_elements_by_css_selector("button[class^='message-anywhere']") 全球 xx xx = 0 定义克里克斯(): 全球 xx 打印 (xx) chazz = driver.find_elements_by_css_selector("button[class^='message-anywhere']") 而 xx

        chazz[xx].click()
        time.sleep(1)
        driver.find_element_by_css_selector("button[data-control-name^='overlay.close']").click()
        time.sleep(1)
    
        xx = xx+1
    
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
    xx = xx+1
    

    i = 0

    while i < 1000:
        clix()
    

    如果我真的想将它运行到无穷大......我只需将 while 循环设置为无法实现的东西......而 i

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多