2016-03-21 20 views
1

Aşağıdaki parçacıkta, AnyEc için bağımsız değişkenler olan iki işlevi manuel olarak girdim.Liste uzunluğu boyunca işlevler ve işlev listesi oluşturma

def element_visible(context, element_id): 
    element = WebDriverWait(context.browser, 10).until(AnyEc(
     expected_conditions.visibility_of_element_located((By.ID, element_id[0])), 
     expected_conditions.visibility_of_element_located((By.ID, element_id[1])) 
    )) 
    return element 
Ben listesi uzunluğuna bağlı olarak, fonksiyonlar olarak bu argümanlar ELEMENT_ID oluşturmak mümkün olacaktır nasıl

?

Her biri için kullanmayı denedim, ancak bir dize argümanı olarak ayrıştırılmamış bir virgülle ayrılmış işlevler listesi oluşturamadım.

Düzenleme: Yinelenen işlevler şimdi önerilen güncelleştirmelerle çalıştırılıyor gibi görünüyor. Maalesef artık geri dönmek için fonksiyonlar alıyorum görünmüyor. Aşağıda

benim güncellenen kod:

class AnyEc: 
    # Use with WebDriverWait to combine expected_conditions in an OR 
    def __init__(self, *args): 
     self.ecs = args 

    def __call__(self, browser): 
     for fn in self.ecs: 
      try: 
       if fn(browser): 
        # Return element ID located and element object 
        return [fn.locator[1], fn(browser)] 
      except: 
       pass 

def element_visible(context, element_id): 
    # Iterate through element_id list to provide args for AnyEc 
    args = [expected_conditions.visibility_of_element_located((By.ID, id)) for id in element_id] 
    element = WebDriverWait(context.browser, 10).until(AnyEc(*args)) 
    return element 

Düzenleme 2: Şu anda inelegant olmasına rağmen aşağıdaki kodu kullanarak başvurmadan ediyorum:

def element_visible(context, element_id): 
    if isinstance(element_id, str): 
     element = WebDriverWait(context.browser, 10).until(AnyEc(
      expected_conditions.visibility_of_element_located((By.ID, element_id)) 
     )) 
    else: 
     element = WebDriverWait(context.browser, 10).until(AnyEc(
      expected_conditions.visibility_of_element_located((By.ID, element_id[0])), 
      expected_conditions.visibility_of_element_located((By.ID, element_id[1])) 
     )) 
    return element 
+0

hariç ... 'denemek çıkarın. –

+0

Maalesef hala geri dönüşü olmayan sonuçlar. Deneme/geçiş, herhangi bir eleman bulunmazsa fonksiyonun aşağıdaki işleve geçmesine izin vermektir. Aynı komut dosyasını elle yazılmış bağımsız değişkenlerle çalıştırdığınızda, düzgün çalışıyor gibi görünüyor. – matchai

+0

Python 2'de, yeni bir stil sınıfı almak için 'AnyEc (object):' sınıfını daha iyi kullanın. –

cevap

2

ilk Fonksiyonlarınızı oluşturun:

args = [expected_conditions.visibility_of_element_located((By.ID, id_)) 
     for id_ in element_id] 

Kullanım * ile:

element = WebDriverWait(context.browser, 10).until(AnyEc(*args)) 

Böyle ayrı argümanlar olarak liste olarak unpack bir dizi için * sözdizimini kullanabilirsiniz.

+0

İşlevler argümanlar olarak alınmakta, ancak artık hiçbir şey geri dönmemektedir. neden olabileceği ile ilgili herhangi bir fikir? – matchai

+0

Yaklaşımınız ile aynı etkiyi göstermelidir. Hala "AnyEc" ile çalışmaya devam ediyor musunuz? –

+0

Evet öyle. Şu anda çalışan kodla bir düzenleme ekledim. – matchai

3

beklenen koşulları toplayın bir liste ve sonra :

conditions = [ 
    expected_conditions.visibility_of_element_located((By.ID, item)) 
    for item in element_id 
] 
element = WebDriverWait(context.browser, 10).until(AnyEc(*conditions)) 
+0

İşlevler argüman olarak alınmakta, ancak artık hiçbir şey geri dönmemektedir. neden olabileceği ile ilgili herhangi bir fikir? – matchai

1

için Python'un * args bir işleve argümanlar listesini geçmek: bir istisna ve istisna ne tür olup olmadığını görmek için pass`:

def element_visible(context, element_id): 
    any_ec_args = [] 
    for i, element in enumerate(element_id): 
     arg = expected_conditions.visibility_of_element_located((By.ID, 
                   element_id[i])) 
     any_ec_args.append(arg) 
    element = WebDriverWait(context.browser, 10).until(AnyEc(*any_ec_args)) 
    return element