1

上下文:我的意思是多线程几个浏览器实例并在其中执行进程。

提问的原因:我想知道在 python selenium 中检查元素的最有效/最省钱的方法是什么。我已经尝试了两种方法,我将在下面展示,并且对我的每一种方法都有一些了解。

首先,这是我返回驱动程序实例的函数:

def open_driver():
    chrome_options = webdriver.ChromeOptions()
    prefs = {"profile.default_conte nt_setting_values.notifications" : 2}
    chrome_options.add_experimental_option("prefs", prefs)
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument('ignore-certificate-errors')
    chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])

    capa = DesiredCapabilities.CHROME
    capa["pageLoadStrategy"] = "none"

    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome, desired_capabilities=capa)

    return driver

请注意这一特定行:

capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"

据我了解,这将告诉 selenium 不要等待 dom 完全加载。这是我必须选择的性能权衡,因为这个特定页面有时会无休止地卡在document.readyState == interactive

因此,在检查元素是否存在时,我基本上有两个选择(我也很感激建议),它们是:

  • WebDriverWait(self.driver,self.timeout).until(EC.presence_of_element_located((By.XPATH, element)))它返回一个 WebElement。关于这条线的两件事:

    • 我认为它不尊重self.timeout时间,capa["pageLoadStrategy"] = "none"但我不确定

    • 它非常不稳定,有时它运行得很快,有时很慢。

  • driver.execute_script("document.getElementsByClassName('alert alert-danger ng-binding ng-scope')[0].innerText")

与上述方法相比,这种try: except:方法的执行速度似乎要快得多,但它似乎会使浏览器过载,然后执行会更频繁地显示错误(从服务器获取数据时出错)

话虽如此,并重申我是新手,我感谢您花时间阅读我的问题。

PS:我全力以赴寻求建议、改进和特别修正。

4

1 回答 1

1

解决您的疑虑:


结论

特定页面有时会无休止地卡住会相对更容易解决。然而,绕过

document.readyState == interactive

并赞成:

capa["pageLoadStrategy"] = "none"

并且将Selenium WebDriver配置为不等待 dom 完全加载不仅是性能上的折衷,而且也是您被迫使用presence_of_element_located()而不是visibility_of_element_located()导致混乱不稳定的障碍。

于 2022-02-03T20:32:46.920 回答