While循环需要很长时间才能完成

时间:2019-08-12 16:04:55

标签: python selenium selenium-webdriver

我有一个while loop,我认为它应该运行得快得多,但是最多需要50秒才能浏览网站中的最多350行。

我尝试制作单独的if语句,但这花费了相同的时间。

while 'x' not in driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip():
                VAR1 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr[11]/td[2]').text.strip()
                if driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip() == 'Y':
                    VAR2 = ''
                    VAR2 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[2]/span').text.strip()
                elif driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip() == 'Z':
                    VAR3 = ''
                    VAR3 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[2]/span').text.strip()
                elif driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip() == 'A':
                    VAR4 = ''
                    VAR4 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[2]/span').text.strip()
                elif driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip() == 'B':
                    VAR5 = ''
                    VAR5 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[2]/span').text.strip()
                elif driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip() == 'C':
                    VAR6 = ''
                    VAR6 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[2]/span').text.strip()
                elif driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip() == 'D':
                    VAR7 = ''
                    VAR7 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[2]/span').text.strip()
                elif driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip() == 'E':
                    VAR8 = ''
                    VAR8 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[2]/span').text.strip()
                else:
                    pass
                output = VAR1 + '|' + VAR2 + '|' + VAR3 + '|' + VAR4 + '|' + VAR5 + '|' + VAR6 + '|' + VAR7 + '|' + VAR8
                print(output)
                n += 1
else:
     n += 1

我得到了正确的输出,但是需要很长时间。我可以做些什么来提高循环速度?

2 个答案:

答案 0 :(得分:3)

主要问题是您要在3到9次之间调用一个非平凡的函数,而其中大多数调用只是重复您已经完成的搜索。为您要检查的每一行调用一次一次函数,存储结果并与之进行比较。

# This call has no variables; do it only once
VAR1 = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr[11]/td[2]').text.strip()

# Let a `for` handle your counter; break the loop when done.
for n in range(len(your_table)):
    row_n = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/th/div/table/tbody/tr['+str(n)+']/td[1]/span').text.strip()
    if x in row_n:
        break
    elif row_n = "Y":
        ...

还考虑使用列表处理一系列VARn变量;您可以使用类似的列表["Y", "A", ...]为目标字符串建立索引,然后使用内部循环和join调用来构建输出行。

答案 1 :(得分:1)

我建议使用xpath轴将元素定位在不同的位置。使用循环的代码成本更高,并且到达特定元素需要花费不必要的时间。现在,有了xpath轴,您就可以轻松地在DOM中向上或向下遍历xpath。