nth-of-type
работает в соответствии с индексом того же типа элемента, но nth-child
работает только в соответствии с индексом независимо от того, какой тип элементов сиблингов.
Например
<div class="one">...</div>
<div class="two">...</div>
<div class="three">...</div>
<div class="four">...</div>
<div class="five">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
Предположим, что в выше html мы хотим скрыть все элементы, имеющие класс отдыха.
В этом случае nth-child
и nth-of-type
будут работать точно так же, как и все элементы одного типа, <div>
, поэтому css должен быть
.rest:nth-child(6), .rest:nth-child(7), .rest:nth-child(8), .rest:nth-child(9), .rest:nth-child(10){
display:none;
}
OR
.rest:nth-of-type(6), .rest:nth-of-type(7), .rest:nth-of-type(8), .rest:nth-of-type(9), .rest:nth-of-type(10){
display:none;
}
Теперь вам должно быть интересно узнать, в чем разница между nth-child
и nth-of-type
, так что это разница
Предположим, что html is
<div class="one">...</div>
<div class="two">...</div>
<div class="three">...</div>
<div class="four">...</div>
<div class="five">...</div>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>
В приведенном выше html тип элемента .rest
отличается от других .rest
- это абзацы, а другие - div, поэтому в этом случае if вы используете nth-child
, вы должны писать так
.rest:nth-child(6), .rest:nth-child(7), .rest:nth-child(8), .rest:nth-child(9), .rest:nth-child(10){
display:none;
}
, но если вы используете nss-тип css, это может быть
.rest:nth-of-type(1), .rest:nth-of-type(2), .rest:nth-of-type(3), .rest:nth-of-type(4), .rest:nth-of-type(5){
display:none;
}
Как тип Элементом
blockquote >.rest
является<p>
, поэтому здесьnth-of-type
обнаруживает тип.rest
, а затем он накладывает css на 1-й, 2-й, 3-й, 4-й, 5-й элементы<p>
.
Старый вопрос, новый ответ (для чего это стоит): просто установите пакет Nuget Selenium.WebDriver.ChromeDriver. Chromedriver.exe будет находиться в каталоге bin / debug при следующей сборке.
На этой странице github jsakamoto / nupkg-selenium-webdriver-chromedriver / , которая после запуска Install-Package Selenium.WebDriver -Version 3.5.2
хромедривера (.exe) лежит под этой папкой
"{папка решения} /packages/Selenium.WebDriver.ChromeDriver. {Ver} / driver / {platform}"
Я обнаружил, что, хотя пакет Selenium.WebDriver.ChromeDriver NuGet был загружен, и, следовательно, файл chromedriver.exe копировался в папку bin во время компиляции, дополнительно его необходимо пометить как элемент развертывания ( модульный тест, который был скопирован в / запущен из папки TestResults) - т.е.
[DeploymentItem (@ "chromedriver.exe")]
Поскольку вы используете C #, вы должны использовать перегрузку конструктора для ChromeDriver, которая позволяет вам указать путь к каталогу, содержащему chromedriver.exe. Для остроумия:
IWebDriver driver = new ChromeDriver(@"C:\my\path\to\chromedriver\directory");
you may have enum for your all drivers :
public enum Drivers
{
Chrome,
Firefox,
Safari,
Edge,
IE
}
public static IWebDriver GetDriver(Drivers driver)
{
outPutDirectory -> - это место, куда копируются все поддерживаемые dll и файлы при создании решения. пример: C: \ Users \ Mike \ source \ repos \ Automation \ Automation \ bin \ Debug
var outPutDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
// below is my location where I copied all drivers like chromedriver.exe
lativePath -> - это одна из папок, копируемых при сборке отдельного примера: C: \ Users \ Mike \ source \ repos \ Automation \ Automation \ bin \ Debug \ BrowserDriver
var relativePath = @"..\..\bin\Debug\BrowserDriver";
// Таким образом, chromeDriverPath сообщит вам точное местоположение вашего драйвера независимо от того, на каком компьютере или компьютере вы работаете Automation
var chromeDriverPath = Path.GetFullPath(Path.Combine(outPutDirectory,relativePath));
// return this driver , just debug this code and check the "outPutDirectory" path
return new ChromeDriver(chromeDriverPath);
}
Установите Selenium.WebDriver.ChromeDriver
из NuGet, а затем вы можете сделать следующее:
IWebDriver driver = new ChromeDriver(Environment.CurrentDirectory);
Возможно, это связано с тем, что пакеты NuGet загружаются из глобального места, а не из папки пакетов проектов .NET Framework. Это сработало для меня:
IWebDriver driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Это было сложно выделить - ключ находится в источнике nuget, который содержит Selenium.WebDriver.ChromeDriver.targets
- цели требуют явного присвоения свойств, поэтому chromedriver.exe
никогда не копируется в каталог развертывания vstest.console
, Вот исправление, которое нужно добавить в ваш файл CSPROJ:
PublishChromeDriver
свойство в CSPROJ <PropertyGroup>
<AssemblyName>MyUX.Tests</AssemblyName>
<!-- ... -->
<PublishChromeDriver>True</PublishChromeDriver>
</PropertyGroup>
После того, как это свойство определено, копия chromedriver.exe
будет скопирована в /bin
для vstest.console
. Это исправляет ошибку, которую мы получали:
chromedriver.exe file does not exist in the current directory or in a directory on the PATH environment variable. The driver can be downloaded at http://chromedriver.storage.googleapis.com/index.html
<Target Name="CopyChromeDriverToBin" BeforeTargets="AfterBuild">
<Copy SourceFiles="$(ChromeDriverSrcPath)" DestinationFiles="$(TargetDir)$(ChromeDriverName)" SkipUnchangedFiles="true">
</Copy>
</Target>
Это ошибка, которую я вижу: OpenQA.Selenium.DriverServiceNotFoundException: Файл chromedriver.exe не существует ни в текущем каталоге, ни в каталоге переменной среды PATH. Я решил эту проблему, указав аргумент 'testsettings' в команде для запуска модульных тестов. , например, Я использую "/testsettings:......\Local.Testsettings", потому что файл Local.testsettings на 4 уровня выше, чем уровень, на котором я выполняю эту команду. Вы должны изменить это соответственно. Эта команда используется в файле ccnet.config E:\Development\SampleProject\SampleProject.MvcWebApp\SampleProject.MvcWebApp.JavaScriptUnitTests\JavaScriptUnitTests\bin\Debug>"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest.exe" /testcontainer:JavaScriptUnitTests.dll /category:"JavaScriptUnitTests" /testsettings:..\..\..\Local.Testsettings /resultsfile:..\..\..\..\..\MsTestResults\SampleProject.MvcWebApp.JavaScript.Tests.trx
. <exec>
<executable>C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest.exe</executable>
<baseDirectory>SampleProject.MvcWebApp\SampleProject.MvcWebApp.JavaScriptUnitTests\JavaScriptUnitTests\bin\Debug</baseDirectory>
<buildArgs>/testcontainer:JavaScriptUnitTests.dll /category:"JavaScriptUnitTests" /testsettings:..\..\..\Local.Testsettings /resultsfile:..\..\..\..\..\MsTestResults\SampleProject.MvcWebApp.JavaScript.Tests.trx</buildArgs>
<successExitCodes>0</successExitCodes>
</exec>
Если вы используете Atata и .Net Core, см. Эту страницу: https://atata.io/getting-started/#dot-net-core-configuration
AtataContext.Configure()
.UseChrome()
.WithFixOfCommandExecutionDelay()
.WithLocalDriverPath()
.UseCulture("en-us")
.Build();
Вот строки, которые вы хотите убедиться:
.UseChrome()
.WithFixOfCommandExecutionDelay()
.WithLocalDriverPath()