Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 而循环需要很长时间才能完成_Python_Selenium_Selenium Webdriver - Fatal编程技术网

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

Python 而循环需要很长时间才能完成,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,我有一个while循环,我觉得应该运行得快得多,但在网站上最多350行的内容中,需要花费50秒 我曾经尝试过单独的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.fi

我有一个
while循环
,我觉得应该运行得快得多,但在网站上最多350行的内容中,需要花费50秒

我曾经尝试过单独的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

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

主要的问题是,你调用一个非平凡函数的次数从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":
        ...

还考虑用列表处理您的系列<代码>瓦恩<代码>变量;您可以使用类似的列表为目标字符串编制索引,然后使用内部循环和连接调用构建输出行。

我建议使用xpath axis来定位不同位置的元素。使用循环会增加代码成本,并且需要花费不必要的时间才能到达特定元素。现在,使用xpath axis,您可以轻松地在DOM中向上或向下遍历xpath。

您不断地对相同的两个xpath值调用
find\u element\u by\u xpath()
。我想这是一个有点昂贵的手术。为每个所需的xpath调用一次,保存结果,然后在
if
语句中检查结果,而不是再次调用它。@JohnGordon这大大加快了程序的速度。谢谢。在发布答案后更改问题详细信息?不好。。。现在,答案需要编辑才能保持正确。DOM代表什么?它代表可以访问以供参考的文档对象模型