我正在尝试编写一个自动化测试,该测试将转到特定的网页,单击内部的链接并留在下一页。该下一页将不会总是显示(有时会显示连接错误),因此我正在使它找到一个特定的元素(应该位于我要查找的页面中),如果找到了该元素,它将如果没有,请留在此处,然后返回脚本的开头(进行循环)。我可以转到页面并单击链接,但是当发生连接错误时,它只会停留在该位置,并且不会返回。我在python和selenium中还很陌生,所以可能有些事情我仍然不完全了解,但是我正在学习实践。我被困在这里:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import NoSuchElementException
def driver_init():
driver = webdriver.Chrome(executable_path=r'C:#the path')
driver.get('#the webpage')
element = driver.find_element(By.XPATH, '//*[@id="conten"]/table/tbody/tr[1]/td/a')
element.click()
elt = driver.find_element(By.XPATH,'//*[@id="logint"]/div/a/img')
elt = True
driver_init()
while elt = False:
driver_init()
如果未显示该元素,如何使其重复脚本?或者如果发生连接错误,如何使其重复脚本?它不是在刷新页面,而是要追溯到开始,我尝试了很多事情,但没有任何帮助,因此这些尝试中可能还会留下一些文字。预先感谢您的帮助。
答案 0 :(得分:0)
首先,您应该使用selenium wait等待元素出现。 在失败时重复部分代码不是常见的做法。为什么此页面始终加载不正确?
答案 1 :(得分:0)
我不会在这里编码。我给您书面的解决方案,并希望自己编写代码。
第1步:创建两个方法第一个初始化Webdriver。第二次杀死网络驱动程序
第2步:将FLAG声明为false,然后初始化Web驱动程序并调用chrome,然后执行使用WEBDRIVER WAIT查找特定元素的活动。 如果找到,请继续下一步,并将FLAG设置为true。
第3步:如果FLAG仍然为false,请调用KILL WEBDRIVER方法,然后调用driver_init():方法
答案 2 :(得分:0)
您所描述的是页面加载后需要对结果进行条件处理。 Selenium等待元素会通过还是失败,但是根据我的经验,不允许条件逻辑包装它。一旦找不到元素,测试就会结束。除了您的示例之外,A / B测试可能还会发生一种情况,其中有30%的时间加载了不同的页面,并且您希望根据加载的不同结果转移测试。
您可以做的是创建一个保留主要测试自动化方法的方法,以及一个辅助方法来处理等待或重新启动测试的方法。此辅助方法使用正则表达式在页面源中查找项目。正则表达式可以围绕它建立条件,而不必过早结束测试。这是一个示例:
import re # Importing the RegEx library
def your_test(driver):
# your selenium test code up to when you need to wait
# I'm passing the defined webdriver along with the text I'm looking for in the page source.
find_or_restart(driver, "Thank You!")
# your test code after something is found found on page....
def find_or_restart(driver, text):
src = driver.page_source # loading page source
text_found = re.search(r'%s' % (text), src) # regex looking for text
print("checking for text on page...")
if text_found:
return
else:
print("not found. restart test...")
your_test(driver)
应检查连接错误。
另一方面,如果失败情况在100%的情况下发生,则将是无限循环。您可以添加一个计数器,作为全局变量,每次触发else条件时都会增加。然后在find_or_restart方法中,检查计数器的值,如果该值大于指定的数量,则将测试作为失败结束。
有时,QA社区会认为这样的测试(例如解决连接错误)不是有效的解决方法。相反,他们会建议测试人员让它失败,以便有人可以修复您尝试解决的问题)。通常,这可能是最佳做法,但是,在某些情况下,您可能正在与第三方进行测试,以控制其正常运行时间。有时需要解决方法。在电信(自动遍历多个运营商的电话)或为游戏构建机器人等方面,都有很多例子。无论如何,我希望这会有所帮助。