хорошо, в хроме, нажмите правой мышкой на кнопке Найти в яндексе, выберите Inspect. в dev tools окне в правом верхнем углу выберите пункт меню Properties и раскройте первую же ветку дерева. Похоже на то, что вы видите через IE COM в powershell?
хорошо, давайте по пунктам.
стабильность IE.
если вы про странные ошибки при использовании $ie.document.getElementBy*(), то они, если не ошибаюсь, решаются так: $ie.document.IHTMLDocument3_getElementsBy*()
IHTMLDocument3_getElementById
IHTMLDocument3_getElementsByName
IHTMLDocument3_getElementsByTagName
что ещё со стабильностью?
чтобы не зависеть от классов и привязок, которые меняются и ломают скрипты попробуйте, где это возможно, отказаться от скринскрейпинга и воспользуйтесь прямыми http GET/POST запросами на сервер через invoke-webrequest. это не всегда возможно ибо на многих сайтах некоторые вещи делаются через javascript, который invoke-webrequest не обрабатывает по определению. берете fiddler или те же dev tools в хроме и смотрите какие запросы и куда шлются при открытии страницы и при работе с нею. повторяете их в powershell. если нету хитрых javascript на сайте, то поведение браузера можно полностью имитировать в powershell, используя прямые http запросы.
и dev tools и ie работают с DOM. и тот и другой видят один и тот же DOM страницы и одни и те же элементы и их свойства.
дайте пример страницы, на которой вы не можете найти список свойств элемента в хром dev tools.
ну почему же. вот вам реальная история. у сигейта была партия дисков (ОЧЕНЬ большая партия), в которых они применили слишком густую смазку в механизме поворота штанги держателя головок (или она очень быстро теряла свои изначальные качества по вязкости, не помню точно). они работали, но без обновления прошивки летели абсолютно одинаково (это давно было, не помню точно как, но кажется так же - не проходили spin-up). а обновление прошивки всего-то и делало, что заставляло блок головок двигаться чаще - даже когда не шли запись/чтение - чтобы смазка тупо не успевала загустевать.
вы б спросили у "родственника" что с дисками, ибо в игре против дохлых дисков всегда выигрывают дохлые диски.
надеюсь только, что денег вы за них не платили...
кстати, именно этому диску скоро 10 лет стукнет...
однако дело не в этом. каким бы образом вы ни управляли браузером, обычно, все эти атрибуты на элементах важны только во время написания/тестирования/правки скрипта. потом скрипт просто работает.
так какова конечная цель? что за сценарии? что они будут делать? как часто меняться?
почему нельзя выяснить все нужные атрибуты через dev tools, написать скрипт(ы), используя selenium и оставить их работать дальше?
хорошо.
как вы загрузились - с флэшки/cd или в родную ОС через F8?
что будет если ввести C: и нажать enter? оно перейдет на диск C? если перейдет, потом cd windows например.
я так понимаю, что селениум был написан для тех, кто эти все атрибуты знает наизусть, а не для нас с вами, кому оно нужно раз в год чего-то там поковырять. отсюда и лимитированный функционал из коробки.
а какова конечная цель вашего скрипта? не все же атрибуты на каждом элементе перебирать...
на селениуме свет клином не сошелся, в принципе. есть и другие automation frameworks.
я не настоящий питонячий сварщик, но я подозреваю, что re это питонячий модуль для работы с регулярными выражениями. соответственно, re.findall(pattern, html) найдет все вхождения pattern в объекте/строке html.
но я сомневаюсь, что понимание того, что они там пишут сильно поможет. вывод там один, селениум так не умеет как вам надо.
function Connect-MySQL([string]$user,[string]$pass,[string]$MySQLHost,[string]$database) {
# Load MySQL .NET Connector Objects
[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
# Open Connection
$connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database="+$database+";Pooling=FALSE"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
try {
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
} catch [System.Management.Automation.PSArgumentException] {
"Unable to connect to MySQL server, do you have the MySQL connector installed..?"
$_
Exit
} catch {
"Unable to connect to MySQL server..."
$_.Exception.GetType().FullName
$_.Exception.Message
exit
}
"Connected to MySQL database $MySQLHost\$database"
return $conn
}
function Disconnect-MySQL($conn) {
$conn.Close()
}
foreach ($i in ls -name $dir\*.csv)
{
Write-Host "$i"
$file_content = Get-Content "$dir\$i";
[System.IO.File]::WriteAllLines("$dir2\$i", $file_content);
Remove-Item "$dir\$i"
# So, to insert records into a table
$query = "LOAD DATA LOCAL INFILE '$dir2\$i' INTO TABLE bga FIELDS ENCLOSED BY '`"' TERMINATED BY ';' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
"Opening the connection to DB to send data from this file..."
Connect-MySQL -user $user -pass $pass -mysqlhost localhost -database $database
"QUERY:"
$query
"CONNECTION right after open():"
$conn
$Rows = Execute-MySQLNonQuery -conn $conn -query $query
Write-Host $Rows " inserted into database"
"CONNECTION after command was sent:"
$conn
}
"Closing connection to DB"
Disconnect-MySQL -conn $conn
понятно. оно открывает подключение к базе и тут же его закрывает зачем-то. так что когда вы пытаетесь слать команды - подключение уже закрыто... будем думать почему.
function Connect-MySQL([string]$user,[string]$pass,[string]$MySQLHost,[string]$database) {
# Load MySQL .NET Connector Objects
[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
# Open Connection
$connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database="+$database+";Pooling=FALSE"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
try {
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
} catch [System.Management.Automation.PSArgumentException] {
"Unable to connect to MySQL server, do you have the MySQL connector installed..?"
$_
Exit
} catch {
"Unable to connect to MySQL server..."
$_.Exception.GetType().FullName
$_.Exception.Message
exit
}
"Connected to MySQL database $MySQLHost\$database"
return $conn
}
function Disconnect-MySQL($conn) {
$conn.Close()
}
foreach ($i in ls -name $dir\*.csv)
{
Write-Host "$i"
$file_content = Get-Content "$dir\$i";
[System.IO.File]::WriteAllLines("$dir2\$i", $file_content);
Remove-Item "$dir\$i"
# So, to insert records into a table
$query = "LOAD DATA LOCAL INFILE '$dir2\$i' INTO TABLE bga FIELDS ENCLOSED BY '`"' TERMINATED BY ';' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
"QUERY:"
$query
"CONNECTION:"
$conn
$Rows = Execute-MySQLNonQuery -conn $conn -query $query
Write-Host $Rows " inserted into database"
}