相关疑难解决方法(0)

在Django中进行硒测试后数据库仍在使用中

我有一个Django项目,我将在其中开始编写Selenium测试。第一个看起来像这样:

from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

from core.models import User
from example import settings

BACH_EMAIL = "johann.sebastian.bach@classics.com"
PASSWORD = "password"


class TestImportCRMData(StaticLiveServerTestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.webdriver = webdriver.Chrome()
        cls.webdriver.implicitly_wait(10)

    @classmethod
    def tearDownClass(cls):
        cls.webdriver.close()
        cls.webdriver.quit()
        super().tearDownClass()

    def setUp(self):
        self.admin = User.objects.create_superuser(email=BACH_EMAIL, password=PASSWORD)

    def test_admin_tool(self):
        self.webdriver.get(f"http://{settings.ADMIN_HOST}:{self.server_thread.port}/admin")

        self.webdriver.find_element_by_id("id_username").send_keys(BACH_EMAIL)
        self.webdriver.find_element_by_id("id_password").send_keys(PASSWORD)
        self.webdriver.find_element_by_id("id_password").send_keys(Keys.RETURN)
        self.webdriver.find_element_by_link_text("Users").click()
Run Code Online (Sandbox Code Playgroud)

当我运行它时,测试通过但仍然以以下错误结束:

Traceback (most recent call last):
  File "C:\Users\pupeno\Documents\Eligible\code\example\venv\lib\site-packages\django\db\backends\utils.py", line 83, in _execute
    return self.cursor.execute(sql)
psycopg2.OperationalError: database "test_example" is being accessed by other users
DETAIL: …
Run Code Online (Sandbox Code Playgroud)

python django selenium selenium-webdriver liveservertestcase

7
推荐指数
1
解决办法
489
查看次数

Selenium - 引导模态测试后,后续测试失败,错误为 ElementClickInterceptedError

启动引导模式并关闭它后,selenium 无法在页面上找到任何其他元素。

三个按钮显示在下面的屏幕中。其中 2 个按钮的功能是启动一个引导模式并关闭它,第三个按钮(中间一个)的功能是简单地接收“点击”。

单独测试时,对所有 3 个按钮的测试效果很好,但在集体测试时却失败了。

第一次启动模态并关闭它的测试将通过,但随后的测试因 ElementClickInterceptedError 而失败。

中间有足够的隐式等待,以便模态可以正确加载,但问题仍然存在。

PS - 如果您最终需要尝试,请按照以下步骤操作 1) 复制以下 2 个文件 2) 使用npm install selenium-webdriver 3) 更改测试中的 fileName 变量,根据您自己的文件夹安装 selenium webdriver 。

图 1 - 按钮

图 2 - 模态 1

错误堆栈跟踪

DevTools 监听 ws://127.0.0.1:50210/devtools/browser/81f6bc5f-c6f5-4255-9134-5efa67a92bed [13108:12832:0501/100716.495:ERROR2er3bcepter]Error_switcher3bcepter()元素点击被拦截:元素 ... 在点 (233, 67) 处不可点击。其他元素将在 Object.throwDecodedError (D:\ip300-gk\node_modules\selenium-webdriver\lib\error.js:550:15) 在 parseHttpResponse (D:\ip300-gk\node_modules\selenium-webdriver\lib\http.js:565:13) 在 Executor.execute (D:\ip300-gk\node_modules\selenium-webdriver\lib\http.js:491: 26) at processTicksAndRejections (internal/process/task_queues.js:93:5) at async Driver.execute (D:\ip300-gk\node_modules\selenium-webdriver\lib\webdriver.js:700:17) at async uitest (乙:
name: 'ElementClickInterceptedError',

测试脚本

const driver = require('selenium-webdriver')
const assert = require('assert').strict;
const {Builder, By, Key, until} = require('selenium-webdriver');

let …
Run Code Online (Sandbox Code Playgroud)

javascript selenium webdriver twitter-bootstrap selenium-webdriver

6
推荐指数
1
解决办法
1049
查看次数

Selenium findElements() 是否必须隐式等待返回 0 个元素?

我带着一个关于 Selenium 的问题来到这里。在我的测试中,我需要删除网络应用程序中的某些项目,然后我想验证项目列表是否为空。我知道这看起来微不足道,但我有一些小问题。这就是我想检查我的项目列表是否为空的方式:

Assert.assertEquals(page.getSearchResultList().size(), 0);
Run Code Online (Sandbox Code Playgroud)

简单且有效,但...由于隐式等待而缓慢。

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

事实上,当我删除项目时,thengetSearchResultList().size()是 0 并且 Selenium 总是等待 10 秒,然后 findElements() 返回 0 大小。

为了避免这 10 秒的等待,我有一个解决方法,可以在断言之前修改隐式等待,但我认为这不是一个好主意。

page.getDriver().manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
Assert.assertEquals(page.getSearchResultList().size(), 0);
Run Code Online (Sandbox Code Playgroud)

还有其他更好的解决方案吗?

请求更新 @KunduK

不使用 WebDriverWait 进行断言:

    Instant start = Instant.now();
    List<WebElement> resultSearchList = page.getDriver().findElements(By.cssSelector("[ng-repeat='searchResult in $ctrl.searchResults']"));
    Assert.assertEquals(resultSearchList.size(), 0);
    Instant stop = Instant.now();
    log.debug("Assert Took: " + Duration.between(start, stop).getSeconds() + " sec");
Run Code Online (Sandbox Code Playgroud)

输出:

10:49:59.081 [main] DEBUG impl.AssertNewEntityPage - Assert Took: 10 sec
Run Code Online (Sandbox Code Playgroud)

使用 WebDriverWait 进行断言

    Instant start = Instant.now();
    new WebDriverWait(page.getDriver(), 10).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("[ng-repeat='searchResult in …
Run Code Online (Sandbox Code Playgroud)

java selenium webdriver webdriverwait implicitwait

5
推荐指数
1
解决办法
1714
查看次数

在selenium中使用隐式等待

我是初学者。我理解等待的基本作用,但我对互联网上不同的教程如何放置和解释它感到困惑。例如,在下面的代码中,它被放置在加载 URL 之前。那么,是否只是等待 URL 加载或查找元素或两者兼而有之?如果我在 try 块中使用隐式等待一次,它是否适用于我在代码中执行的每个元素搜索?

from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
Run Code Online (Sandbox Code Playgroud)

selenium selenium-chromedriver selenium-webdriver geckodriver implicitwait

4
推荐指数
1
解决办法
2万
查看次数

JAVA Selenium WebElement覆盖click()方法

override WebElement click()添加一些wait功能的好习惯,因为在某些页面中我需要单击按钮,并且在某些情况下还没有加载按钮,因此我添加了等待以检查元素是否可见。

所以我的问题是:创建abstract class一个实现WebElement并重写click()方法以添加一些等待功能的更好的方法,还是仅在特定页面中进行纯等待的方法更好?

java selenium automation automated-tests

3
推荐指数
1
解决办法
4979
查看次数

Selenium:如何解决 org.openqa.selenium.InvalidElementStateException:无效元素状态

我读过一些在线文章,它们都指向 1 个方向,即当页面加载时找不到元素。在我的 setData() 中,您可以看到我尝试了一些操作,例如使用等待、隐式等待和第一次单击,然后发送用户名。然而似乎没有任何作用。我还考虑过在 pageProperties 中使用“wait”,但后来改变了主意,因为这可能是一个糟糕的设计。

错误 :

Exception in thread "main" org.openqa.selenium.InvalidElementStateException: invalid element state
Run Code Online (Sandbox Code Playgroud)

系统信息:Windows 10、ChromeDriver 2.37.544315、chrome=65.0.3

代码

public class Tour {

    public static WebDriver driver;

    //browser URL information
    public WebDriver getBrowser(String browser, String url){
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Downloads\\chromedriver.exe");

        if(browser.equals("cc")){
            driver= new ChromeDriver();
        }
        driver.get(url);
        return driver;
    }

    // User name and continue button property from 1st page
    public void pageUserNameProperty(String un){
        WebElement login=driver.findElement(By.xpath("//input[@id='usernameOrEmail']"));
        WebElement cont_btn=driver.findElement(By.xpath("//button[contains(@type,'submit')]"));

        //WebDriverWait wait = new WebDriverWait(driver,30);
        //wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='usernameOrEmail']")));
        login.sendKeys(un);
        cont_btn.click();

    }
    // Password and …
Run Code Online (Sandbox Code Playgroud)

java selenium webdriver selenium-webdriver

2
推荐指数
1
解决办法
3万
查看次数

如何通过 Selenium 正确配置隐式/显式等待和 pageLoadTimeout?

我目前有以下设置,但我不确定我的等待(隐式和 pageLoadTimeout)是否有效。这是正确的实现吗?通过将它放在@Before("@setup") 中,它是否适用于每个场景或步骤定义运行?每次我打电话给@Given、@When.. 等时,司机会相应地等待吗?

@Before("@setup")
    public void setUp() {

        driver.manage().deleteAllCookies();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);


    }
Run Code Online (Sandbox Code Playgroud)

为什么需要给下面的wait分配一个WebElement,WebElement元素接收什么?这是正确的实现吗?——

 WebDriverWait wait = new WebDriverWait(driver, 30);
 WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();
Run Code Online (Sandbox Code Playgroud)

java selenium page-load-time webdriverwait implicitwait

2
推荐指数
1
解决办法
3421
查看次数

隐式等待、显式等待、流畅等待

隐式、显式、流利等之间有什么区别?

如果我们在隐式等待中设置 10 秒,并且在 10 秒之前,则在 3 秒内只有元素被定位。

到时候会发生什么?它将等待 10 秒钟或继续进行。

selenium selenium-webdriver webdriverwait fluentwait implicitwait

1
推荐指数
1
解决办法
4081
查看次数

selenium 中的 ChromeDriver 和 WebDriver 有什么区别?

如果我们创建:

ChromeDriver driver=new ChromeDriver();
Run Code Online (Sandbox Code Playgroud)

chrome 驱动程序方法将被执行。

如果我们创建:

WebDriver driver=new ChromeDriver();
Run Code Online (Sandbox Code Playgroud)

再次ChromeDriver执行方法[根据方法覆盖]。

那为什么我们只在执行时写后一个呢?

java selenium webdriver selenium-webdriver webdriver-w3c-spec

0
推荐指数
1
解决办法
1万
查看次数