我正面临这个问题; 我知道这个问题已经出现了,我已经尝试了所提到的解决方案,因此请问我的配置和代码.
之前脚本正在运行,但现在它们不是,所以我尝试制作一个基本的开放浏览器脚本.
最新版本的Selenium WebDriver:http://selenium-release.storage.googleapis.com/3.5/selenium-java-3.5.0.zip
ChromeDriver上的最新版本:http://chromedriver.storage.googleapis.com/index.html?path = 2.31 /
基本打开浏览器代码:
package Trial;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class Trial_Class {
public static void main(String args[]){
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.youtube.com");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到以下错误:
Starting ChromeDriver 2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8) on port 43967
Only local connections are allowed.
Exception in thread "main" org.openqa.selenium.WebDriverException: chrome not reachable
(Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Windows NT 6.3.9600 x86_64) (WARNING: The server did not provide …Run Code Online (Sandbox Code Playgroud) 我有一个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
是的,我知道两者都习惯于等待某个指定的时间。
硒:
driver.implicitly_wait(10)
Run Code Online (Sandbox Code Playgroud)
Python:
import time
time.sleep(10)
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别吗?
启动引导模式并关闭它后,selenium 无法在页面上找到任何其他元素。
三个按钮显示在下面的屏幕中。其中 2 个按钮的功能是启动一个引导模式并关闭它,第三个按钮(中间一个)的功能是简单地接收“点击”。
单独测试时,对所有 3 个按钮的测试效果很好,但在集体测试时却失败了。
第一次启动模态并关闭它的测试将通过,但随后的测试因 ElementClickInterceptedError 而失败。
中间有足够的隐式等待,以便模态可以正确加载,但问题仍然存在。
PS - 如果您最终需要尝试,请按照以下步骤操作 1) 复制以下 2 个文件 2) 使用npm install selenium-webdriver 3) 更改测试中的 fileName 变量,根据您自己的文件夹安装 selenium webdriver 。
错误堆栈跟踪
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
如何用显式等待替换这种隐式等待?
驱动程序 = 新的 ChromeDriver(功能);
driver.manage().deleteAllCookies();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
这在 Before 方法中使用。我能够替换代码中的所有 Thread.sleep(),但我不确定对这个做了什么。
我带着一个关于 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) 我目前有以下设置,但我不确定我的等待(隐式和 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) 隐式、显式、流利等之间有什么区别?
如果我们在隐式等待中设置 10 秒,并且在 10 秒之前,则在 3 秒内只有元素被定位。
到时候会发生什么?它将等待 10 秒钟或继续进行。
selenium selenium-webdriver webdriverwait fluentwait implicitwait
如果我们创建:
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
selenium ×8
implicitwait ×5
java ×4
webdriver ×3
python ×2
django ×1
fluentwait ×1
javascript ×1
sleep ×1