2017-03-06 56 views
1

我运行下面的代码来验证网页上的文字:不断收到元素没有连接到网页文件

def verifyText(self, Text): 
    try: 
     self.switchToFrame(*MainPageLocatars.FRAMEONE) 
     self.switchToFrame(*MainPageLocatars.SUBLISTFRAME) 
    except: 
     pass 
    self.row.find_element_by_xpath(ListViewLocatars.VERIFYTEXT % Text) 

我试过(2)每个步骤之后加入time.sleep但它仍然是给我一个错误,当我运行这个功能 - >>不断得到元件没有以这行代码

self.row.find_element_by_xpath(ListViewLocatars.VERIFYTEXT % Text) 

我在这里调用该函数,我应该在哪里重新定义它附加到页面文件错误?

listview = ListView(self.driver, 'First') 
listview.verifyText("comp1") 

注意,行父:

self.row = self.driver.find_element_by_xpath(ListViewLocatars.ROWPARENT % INDEX_MAP[index]) 

这是我如何定义函数:

class ListView(Page): 

    def __init__(self, driver, index): 

     if index not in INDEX_MAP: 
      raise ValueError("Invalid index %s" % index) 

     self.driver = driver 

     try: 
      self.row = self.driver.find_element_by_xpath(ListViewLocatars.ROWPARENT % INDEX_MAP[index]) 
     # used for VerifyText function only 
     except: 
      self.row = self.driver.find_element_by_xpath(ListViewLocatars.TEXTPARENT % INDEX_MAP[index]) 


    def verifyText(self, Text): 
     try: 
      self.switchToFrame(*MainPageLocatars.FRAMEONE) 
      self.switchToFrame(*MainPageLocatars.SUBLISTFRAME) 
     except: 
      pass 
     self.row.find_element_by_xpath(ListViewLocatars.VERIFYTEXT % Text) 

这里是全码:

# all locaters for this class are defined here only 
class ListView(Page): 

    def __init__(self, driver, index): 

     if index not in INDEX_MAP: 
      raise ValueError("Invalid index %s" % index) 

     self.driver = driver 

     try: 
      self.row = self.driver.find_element_by_xpath(ListViewLocatars.ROWPARENT % INDEX_MAP[index]) 
     # used for VerifyText function only 
     except: 
      self.row = self.driver.find_element_by_xpath(ListViewLocatars.TEXTPARENT % INDEX_MAP[index]) 

    @property  
    def row(self): 
     return self.driver.find_element_by_xpath(ListViewLocatars.ROWPARENT % INDEX_MAP[index]) 


    def verifyText(self, Text): 
     try: 
      self.switchToFrame(*MainPageLocatars.FRAMEONE) 
      self.switchToFrame(*MainPageLocatars.SUBLISTFRAME) 
     except: 
      pass 
     self.row.find_element_by_xpath(ListViewLocatars.VERIFYTEXT % Text) 

这是现在给我这个错误:

Traceback (most recent call last): 
    File "autoLoaderTest.py", line 56, in test02_AutoLoaderSubCompany 
    listview = ListView(self.driver, 'First') 
    File "C:\Users\cverma\Desktop\SOAPProject\mainPage.py", line 44, in __init__ 
    self.row = self.driver.find_element_by_xpath(ListViewLocatars.TEXTPARENT % INDEX_MAP[index]) 
AttributeError: can't set attribute 
+1

这可能是因为页面是因为时间更新您已经声明'row'元素,所以你不能再使用它了,但需要重新定义它 – Andersson

+0

@Andersson,我需要在哪里重新定义它?请参阅我的更新问题 – user7242550

+1

显示什么是“行”,您如何定义它 – Andersson

回答

1

这是StaleElementReferenceException如何被触发以及如何避免它的简化版本。

我想你的代码就像下面:

self.row = self.driver.find_element_by_xpath(ListViewLocatars.ROWPARENT % INDEX_MAP[index]) 
# Now your self.row is accessible. You can use it 
self.driver.find_element_by_xpath('//input[@type="text"]').send_keys('some data') 
# This action could trigger page refresh 
# Now your self.row is not accessible as it was found on previous page 
self.row.find_element_by_xpath(ListViewLocatars.VERIFYTEXT % Text) 
# Here comes StaleElementReferenceException 

如何能避免的话:

@property 
def row(self): 
    return self.driver.find_element_by_xpath(ListViewLocatars.ROWPARENT % INDEX_MAP[index]) 

def verifyText(self, Text): 
    try: 
     self.switchToFrame(*MainPageLocatars.FRAMEONE) 
     self.switchToFrame(*MainPageLocatars.SUBLISTFRAME) 
    except: 
     pass 
    self.row.find_element_by_xpath(ListViewLocatars.VERIFYTEXT % Text) 
    # only now self.row is defined and even if page refreshed 
    # next time you call self.row, element will be re-defined 
+0

时都会重新定义元素,我应该在__init__上将其定义在顶部?我试图做到这一点,但它给我一个错误 类型错误:“财产”对象不是可调用 – user7242550

+0

这可能是因为您尝试使用它作为方法 - 'self.row()',而你应该只喜欢使用属性' self.row',没有'()'。你不应该在'__init __()'里面定义它' – Andersson

+0

这就是我定义它的方式。我已经更新了我的问题。 – user7242550

相关问题