【问题标题】:how to make driver to wait upto 10 seconds to click hyperlink如何让驱动程序等待长达 10 秒点击超链接
【发布时间】:2019-05-31 20:04:05
【问题描述】:

在下面的 URL 中,我需要点击一个邮件图标超链接,有时即使代码正确也无法正常工作,在这种情况下,驱动程序需要等待长达 10 秒并进入下一个级别

https://www.sciencedirect.com/science/article/pii/S1001841718305011

         tags = driver.find_elements_by_xpath('//a[@class="author size-m workspace-trigger"]//*[local-name()="svg"]')
         if tags:
             for tag in tags:
                 tag.click()

这里如何显式或隐式等待--“tag.click()”

【问题讨论】:

  • 你的意思是点击这两个邮件图标旁边的两个链接,这两个名字是WeibingZhang, JunhongQian @scoop realm?

标签: python selenium web-scraping


【解决方案1】:

据我了解,点击元素后应该等到出现作者弹出窗口,然后使用details() 提取?

tags = driver.find_elements_by_css_selector('svg.icon-envelope')

if tags:
    for tag in tags:
        tag.click()
        # wait until author dialog/popup on the right appear
        WebDriverWait(driver, 10).until(
            lambda d: d.find_element_by_class_name('e-address') # selector for email
        )
        try:
            details()
            # close the popup
            driver.find_element_by_css_selector('button.close-button').click()

        except Exception as ex:
            print(ex)
            continue

【讨论】:

    【解决方案2】:

    顺便说一句..您可以在其中一个脚本中从 json 之类的字符串中提取作者联系电子邮件(与点击相同)

    from selenium import webdriver
    import json
    d = webdriver.Chrome()
    d.get('https://www.sciencedirect.com/science/article/pii/S1001841718305011#!')
    script = d.find_element_by_css_selector('script[data-iso-key]').get_attribute('innerHTML')
    script = script.replace(':false',':"false"').replace(':true',':"true"')
    data = json.loads(script)
    authors = data['authors']['content'][0]['$$']
    emails = [author['$$'][3]['$']['href'].replace('mailto:','') for author in authors if len(author['$$']) == 4]
    print(emails)
    d.quit()
    

    您还可以使用请求获取所有推荐信息

    import requests
    headers = {
        'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
              }
    data = requests.get('https://www.sciencedirect.com/sdfe/arp/pii/S1001841718305011/recommendations?creditCardPurchaseAllowed=true&preventTransactionalAccess=false&preventDocumentDelivery=true', headers = headers).json()   
    print(data)
    

    示例视图:

    【讨论】:

    • 先生,这很好,但除了邮件,我还需要作者姓名、文章标题、期刊名称、年份和期号,如果有 10 位作者,我需要打印所有上述详细信息,因为我写了代码,一切都很好,但有时它无法在搜索结果中执行 tag.click()。要在失败时继续循环,它应该回来。搜索结果在这里sciencedirect.com/…
    • 期刊名称是否被认为是Chinese Chemical Letters?请问问题号是多少?
    • 对于单个 url 是可以的,对于每个关键字,我们需要处理大约 6000 个结果,通过此链接“sciencedirect.com/…”,对于每个链接,我们需要解析并再次提取所需的详细信息从中,是不是变成了双重工作?
    【解决方案3】:

    你必须等到元素是可点击的。您可以使用WebDriverWait 函数来实现。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()
    driver.get('url')
    
    elements = driver.find_elements_by_xpath('xpath')
    
    for element in elements:
        try:
            WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.LINK_TEXT, element.text)))
        finally:
            element.click()
    

    【讨论】:

    • 是的先生,但是如何在我的代码中应用 webdriver 等待,Webdriver 需要等待 10 秒,直到“tag.click()”
    • 例如WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, element.text)))
    • 为什么要尝试/最终?
    • 如果WebDriverWait 函数未能“找到”元素,您仍然可以尝试点击它。
    【解决方案4】:

    您可以尝试如下所示单击包含邮件图标的超链接。启动单击时,会显示一个包含附加信息的弹出框。以下脚本可以从那里获取电子邮件地址。当svg 元素存在时,挖掘任何东西总是很麻烦。我使用BeautifulSoup 库是为了使用.extract() 函数来踢出svg 元素,以便脚本可以到达内容。

    from bs4 import BeautifulSoup
    from contextlib import closing
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    with closing(webdriver.Chrome()) as driver:
        driver.get("https://www.sciencedirect.com/science/article/pii/S1001841718305011")
    
        for elem in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[starts-with(@name,'baut')]")))[-2:]:
            elem.click()
            soup = BeautifulSoup(driver.page_source,"lxml")
            [item.extract() for item in soup.select("svg")]
            email = soup.select_one("a[href^='mailto:']").text
            print(email)
    

    输出:

    weibingzhang@ecust.edu.cn
    junhongqian@ecust.edu.cn
    

    【讨论】:

      【解决方案5】:

      使用内置的 time.sleep() 函数

      from time import sleep
      
      tags = driver.find_elements_by_xpath('//a[@class="author size-m workspace-trigger"]//*[local-name()="svg"]')
       if tags:
        for tag in tags:
          sleep(10)
          tag.click()
      

      【讨论】:

      • 不先生它在循环中,驱动程序应该等待最多10秒点击链接,无论点击成功还是失败都应该进入下一级,所以我们需要在这里显式或隐式等待,但我不知道如何在这里使用“tag.click()”
      • 对不起,我不明白你在做什么,你能提供一个更好的解释吗?使用 time.sleep(10) 会等待 10 秒,然后再继续 tag.click(),这不是你想要的吗?
      • 请定义“离开并进入下一级”,你的意思是继续for循环吗?此外,什么决定了它应该等待多长时间。
      • 先生,不用正好等10秒,应该最多等10秒,这个时候如果成功就进入下一级,如果10秒后没有就进入下一级进入下一关。
      • 这是搜索结果sciencedirect.com/…
      猜你喜欢
      • 2018-01-02
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多