如果某个元素被禁用,如何中断循环并从Selenium Python中的多个页面获取文本

yk9xbfzb  于 2022-12-13  发布在  Python
关注(0)|答案(2)|浏览(176)

我是python和selenium的新学习者。我已经写了一个从多个页面提取数据的代码,但是代码中有一定的问题。
1.我不能打破while循环函数,它点击下一页,直到有一个选项。下一页元素在到达最后一页后禁用,但代码仍然运行。
xpath:'//按钮[@aria-label=“下一页”]'
全量程:class="awsui_icon_h11ix_31bp4_98 awsui_size-normal-mapped-height_h11ix_31bp4_151 awsui_size-normal_h11ix_31bp4_147 awsui_variant-normal_h11ix_31bp4_219"
1.我能够得到我想从网页中提取的数据列表,但当我从我的端关闭网页时,我得到了最后一页的数据,结束了while循环。
完整代码:

opts = webdriver.ChromeOptions()
opts.headless = True
driver = webdriver.Chrome(ChromeDriverManager().install())
base_url = "XYZ"
driver.maximize_window()
driver.get(base_url)
driver.set_page_load_timeout(50)
element = WebDriverWait(driver, 50).until(EC.presence_of_element_located((By.ID, 'all-my-groups')))
driver.find_element(by=By.XPATH, value = '//*[@id="sim-issueListContent"]/div[1]/div/div/div[2]/div[1]/span/div/input').send_keys('No Stock')

dfs = []
page_counter = 0
while True:

    wait = WebDriverWait(driver, 30)
    wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//div[contains(@class, 'alias-wrapper sim-ellipsis sim-list--shortId')]")))
    cards = driver.find_elements_by_xpath("//div[contains(@class, 'alias-wrapper sim-ellipsis sim-list--shortId')]")
    sims = []
    for card in cards:
        sims.append([card.text])

    df = pd.DataFrame(sims)    
    dfs.append(df)
    
    print(page_counter)
    page_counter+=1
    try:
        wait.until(EC.element_to_be_clickable((By.XPATH,'//button[@aria-label="Next page"]'))).click()
    
    except:
        break

driver.close()
driver.quit()

我也是,附上类的图像,对不起,我不能分享的URL,因为它的私有域。

qxgroojn

qxgroojn1#

最简单的选择是当“下一页”按钮丢失时,通过超时让wait.until()失败。假设页面的加载速度比这快得多,你可以把超时时间改为5秒,这样当你到达最后一个页面时,循环就会更快地结束。如果你的页面加载速度有时很慢,那么你应该确保超时时间不会意外地过早中断;如果加载时间一直很快,那么您可能可以使用更短的超时间隔。
或者,你可以更仔细地浏览特定的目标网页,找到一些元素,a)总是存在的,b)可以用来确定我们是否在最后一页。然后你可以读取该元素的值,并决定是否在试图找到“下一页”按钮之前中断循环。这可以保存等待最后循环迭代的几秒钟(避免等待超时)但可能不值得这么麻烦。

gmxoilav

gmxoilav2#

更改以下条件

try:
        wait.until(EC.element_to_be_clickable((By.XPATH,'//button[@aria-label="Next page"]'))).click()
    
    except:
        break

如下面所示,pseduocode@disabled是diff,它将确保在按钮被禁用时退出while循环。

if(driver.find_elements_by_xpath('//button[@aria-label="Next page"][@disabled]'))).size()>0)
    break
else
    driver.find_element_by_xpath('//button[@aria-label="Next page"]').click()

相关问题