如何减少此代码块

时间:2018-07-07 23:53:02

标签: python python-3.x python-2.7 selenium

我对Python完全陌生,并且刚意识到列表理解,这给人留下了深刻的印象。我想知道是否存在类似的方法来减少以下if语句。

if len(browser.find_elements_by_xpath('//span[@gogo-test="backers"]')) > 0:
    backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()][0]

理想情况下,我想使用backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()][0],但是与Scrapy不同,Selenium如果找不到任何内容,则不会返回None,并且肯定会出现{{1 }}不存在。

谢谢

2 个答案:

答案 0 :(得分:1)

通过使用Page-Object-Model(这是一种常见的Selenium约定),您可以减少代码块:

if  page.get_spans_array_size() > 0:
    backers = [sub for sub in  page.get_spans_array() if sub.isdigit()][0]

页面代码:

class Page:

    def __init__(self, driver):
        self.driver = driver

    def get_spans_array_size(self):
        return len(
                   ## self.driver.find..  )

    def get_spans_array(self):
        return ## self.driver.find..  

我的开源项目中有一个POM的python示例: https://github.com/AutomatedOwl/selenium-python-pom-example

答案 1 :(得分:0)

backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()]
backers = backers[0] if len(backers) > 0 else None

它已经很短了,几乎没有改进:)或者

backers = list(filter(lambda sub: sub.isdigit(),
                      browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split()
               ))

backers = backers[0] if len(backers) > 0 else None

或使用正则表达式:

import re
backers = browser.find_elements_by_xpath('//span[@gogo-test="backers"]')
backers = backers[0].text if len(backers) > 0 else ''
backers = re.findall('(\d+)', backers)